@ethlete/core 5.0.0-next.3 → 5.0.0-next.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,15 +1,17 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, AfterViewInit, Signal, ComponentRef, StaticProvider, EmbeddedViewRef, Provider, InjectOptions, TemplateRef, QueryList, InputSignal, InputSignalWithTransform, PipeTransform, TrackByFunction, ElementRef, WritableSignal, DestroyRef, Injector, RendererStyleFlags2, OnInit, OnDestroy } from '@angular/core';
2
+ import { InjectionToken, AfterViewInit, InputSignal, ApplicationRef, Signal, ComponentRef, StaticProvider, EmbeddedViewRef, ElementRef, QueryList, WritableSignal, InputSignalWithTransform, RendererStyleFlags2, Type, Provider, Injector, ViewContainerRef, Binding, computed, InjectOptions, TemplateRef, PipeTransform, TrackByFunction, DestroyRef, OnInit, OnDestroy } from '@angular/core';
3
3
  import * as rxjs from 'rxjs';
4
4
  import { Observable, BehaviorSubject, Subject } from 'rxjs';
5
5
  import * as _ethlete_core from '@ethlete/core';
6
6
  import { OverlayRef } from '@angular/cdk/overlay';
7
7
  import { ComponentPortal, ComponentType } from '@angular/cdk/portal';
8
- import { Placement, OffsetOptions, Padding } from '@floating-ui/dom';
8
+ import { Placement, OffsetOptions, Padding, VirtualElement } from '@floating-ui/dom';
9
9
  import { MatchListView, ParticipantViewUnion, MatchRankingView, StageType } from '@ethlete/types';
10
10
  import * as _angular_platform_browser from '@angular/platform-browser';
11
- import { FormGroup, AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';
12
- import { Data, Params, Event as Event$1 } from '@angular/router';
11
+ import { AbstractControl, FormGroup, ValidationErrors, ValidatorFn } from '@angular/forms';
12
+ import * as _angular_router from '@angular/router';
13
+ import { Data, Params, Router } from '@angular/router';
14
+ import { FieldTree } from '@angular/forms/signals';
13
15
 
14
16
  declare const ANIMATABLE_TOKEN: InjectionToken<AnimatableDirective>;
15
17
  type AnimationEndEvent = {
@@ -36,6 +38,14 @@ declare class AnimatableDirective {
36
38
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AnimatableDirective, "[etAnimatable]", ["etAnimatable"], {}, {}, never, never, true, never>;
37
39
  }
38
40
 
41
+ declare const ANIMATION_DEBUG_STORAGE_KEY = "et-overlay-debug";
42
+ /**
43
+ * Debug logging for overlay and animation lifecycle internals.
44
+ * Enable via `localStorage.setItem('et-overlay-debug', 'true')` and reload.
45
+ */
46
+ declare const isAnimationDebugEnabled: () => boolean;
47
+ declare const animationDebugLog: (scope: string, ...args: unknown[]) => void;
48
+
39
49
  declare const ANIMATED_IF_TOKEN: InjectionToken<AnimatedIfDirective>;
40
50
  declare class AnimatedIfDirective {
41
51
  private templateRef;
@@ -77,10 +87,208 @@ declare class AnimatedLifecycleDirective implements AfterViewInit {
77
87
  private removeClass;
78
88
  private removeClasses;
79
89
  private updateState;
90
+ private debugLog;
80
91
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AnimatedLifecycleDirective, never>;
81
92
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AnimatedLifecycleDirective, "[etAnimatedLifecycle]", ["etAnimatedLifecycle"], { "skipNextEnter": { "alias": "skipNextEnter"; "required": false; "isSignal": true; }; }, { "stateChange": "stateChange"; "skipNextEnter": "skipNextEnterChange"; }, never, never, true, [{ directive: typeof AnimatableDirective; inputs: {}; outputs: {}; }]>;
82
93
  }
83
94
 
95
+ /**
96
+ * Cascades hover/active-driven color DOWN to descendants explicitly marked with
97
+ * `ColorInteractiveDirective` — this element does not color itself. Use it when a wrapper should
98
+ * expand a nested control's hit/visual area (e.g. clicking a checkbox's label should light up the
99
+ * checkbox itself), never to give a wrapper its own interactive coloring — that's
100
+ * `ColorInteractiveDirective`.
101
+ *
102
+ * Does nothing unless at least one descendant carries `ColorInteractiveDirective` — check for
103
+ * that before adding this. It was mistakenly added to a component with no such descendant once
104
+ * already, where it did nothing but was confusing to read.
105
+ */
106
+ declare class ColorInteractiveContainerDirective {
107
+ private styleManager;
108
+ constructor();
109
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ColorInteractiveContainerDirective, never>;
110
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ColorInteractiveContainerDirective, "[etColorInteractiveContainer]", never, {}, {}, never, never, true, never>;
111
+ }
112
+
113
+ /**
114
+ * Marks a descendant as NOT counting toward an ancestor's `ColorInteractiveDirective`
115
+ * `:hover`/`:active` reaction (via the `:has()` guard in color-interactive-styles.component.css).
116
+ * Use it for content that's incidentally inside an interactive ancestor but isn't part of what
117
+ * makes that ancestor interactive — e.g. a hint/error block sitting inside a form field's frame.
118
+ *
119
+ * This only suppresses the ancestor's OWN reaction to hovering/pressing the excluded element — it
120
+ * has no effect on custom-property inheritance into descendants past the excluded element. If
121
+ * what you actually need is "stop my own cosmetic styling from reacting to a parent's unrelated
122
+ * interaction," this is the wrong tool; that's the class of bug `ColorInteractiveHasFocusDirective`
123
+ * used to have (see its own comment).
124
+ */
125
+ declare class ColorInteractiveExcludeDirective {
126
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ColorInteractiveExcludeDirective, never>;
127
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ColorInteractiveExcludeDirective, "[etColorInteractiveExclude]", never, {}, {}, never, never, true, never>;
128
+ }
129
+
130
+ /**
131
+ * Tints `--et-theme-color-primary-*` etc. only when a descendant genuinely has `:focus-visible`
132
+ * (`:has(:focus-visible)`) — never on mouse `:hover`/`:active`. Use this for a wrapper (like a
133
+ * form field's frame) that should show the theme color while its control is focused, but must
134
+ * NOT react to incidental mouse interaction with unrelated nested widgets (a toolbar button, a
135
+ * rendered link) that happen to live inside the same wrapper.
136
+ *
137
+ * The color it resolves to is the theme's BASE accent, not the `-focus` variant: the `-focus`
138
+ * shade is the treatment for an element that is itself focused, whereas a container only mirroring
139
+ * a child's focus should read as the plain accent color.
140
+ *
141
+ * Deliberately does NOT also carry `ColorInteractiveDirective`'s `et-color-interactive` class:
142
+ * that class's plain `:hover`/`:active` rules locally override the same (inheriting)
143
+ * `--et-theme-color-primary-rgb`, so anything bubbling up from ANYWHERE in the subtree would
144
+ * leak the transient hover/press color into every descendant reading it for unrelated cosmetics —
145
+ * exactly the bug this directive's only consumer (form-field) shipped once, before the two
146
+ * behaviors were split apart. If you need the plain hover/active reaction too, add
147
+ * `ColorInteractiveDirective` explicitly and make sure you actually want both.
148
+ */
149
+ declare class ColorInteractiveHasFocusDirective {
150
+ private styleManager;
151
+ constructor();
152
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ColorInteractiveHasFocusDirective, never>;
153
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ColorInteractiveHasFocusDirective, "[etColorInteractiveHasFocus]", never, {}, {}, never, never, true, never>;
154
+ }
155
+
156
+ /**
157
+ * Makes an element react to ITS OWN `:hover`/`:active`/`:focus-visible`/`[disabled]` by tinting
158
+ * `--et-theme-color-primary-*`/`-on-primary-*`/`-ink-*` with the current color theme. Use this on
159
+ * a single, self-contained interactive element — a button, a checkbox, a segmented button.
160
+ *
161
+ * Do NOT apply this to a wrapper that also contains OTHER, independently-interactive elements
162
+ * (e.g. a toolbar with its own buttons, or a form-field's control slot). These are ordinary
163
+ * inheriting CSS custom properties, so a descendant reading them for its own cosmetics (a caret
164
+ * color, a link color) gets swept along whenever ANYTHING inside the wrapper is hovered or
165
+ * clicked — not just when the wrapper itself is the thing being interacted with. That exact bug
166
+ * shipped once already; see ColorInteractiveContainerDirective/ColorInteractiveHasFocusDirective
167
+ * for the shapes that avoid it.
168
+ */
169
+ declare class ColorInteractiveDirective {
170
+ private styleManager;
171
+ constructor();
172
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ColorInteractiveDirective, never>;
173
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ColorInteractiveDirective, "[etColorInteractive]", never, {}, {}, never, never, true, never>;
174
+ }
175
+
176
+ declare const SURFACE_TYPE: {
177
+ readonly LIGHT: "light";
178
+ readonly DARK: "dark";
179
+ };
180
+ type SurfaceType = (typeof SURFACE_TYPE)[keyof typeof SURFACE_TYPE];
181
+ type SurfaceThemeColor = `${number} ${number} ${number}`;
182
+ type SurfaceInteractionColor = {
183
+ default: SurfaceThemeColor;
184
+ hover: SurfaceThemeColor;
185
+ focus: SurfaceThemeColor;
186
+ active: SurfaceThemeColor;
187
+ disabled: SurfaceThemeColor;
188
+ };
189
+ type SurfaceTheme = {
190
+ name: string;
191
+ type: SurfaceType;
192
+ elevation: number;
193
+ isDefault?: boolean;
194
+ interactionColor?: SurfaceInteractionColor;
195
+ background: SurfaceThemeColor;
196
+ color: SurfaceThemeColor;
197
+ colorMuted: SurfaceThemeColor;
198
+ colorSubtle: SurfaceThemeColor;
199
+ border: SurfaceThemeColor;
200
+ };
201
+ /**
202
+ * Augmentable registry for the literal set of surface theme names an app defines. Left
203
+ * empty by default, which keeps surface-theme-name-accepting APIs (like `etProvideSurface`)
204
+ * typed as plain `string`.
205
+ *
206
+ * Apps that want those APIs checked and autocompleted against their own surface theme
207
+ * names should augment this interface once, near where their surface themes are defined:
208
+ *
209
+ * ```ts
210
+ * declare module '@ethlete/core' {
211
+ * interface EthleteSurfaceThemeNameRegistry {
212
+ * name: 'card' | 'sheet' | 'popover';
213
+ * }
214
+ * }
215
+ * ```
216
+ */
217
+ interface EthleteSurfaceThemeNameRegistry {
218
+ }
219
+ type RegisteredSurfaceThemeName = EthleteSurfaceThemeNameRegistry extends {
220
+ name: infer N extends string;
221
+ } ? N : string;
222
+ declare const createCssSurfaceName: (name: string) => string;
223
+ declare const resolveSurfaceByElevation: (themes: SurfaceTheme[], type: SurfaceType, elevation: number) => SurfaceTheme | null;
224
+ declare const ɵProvideSurfaceThemes: (valueOverride?: (SurfaceTheme | undefined)[] | undefined) => _angular_core.Provider[];
225
+ declare const injectSurfaceThemes: {
226
+ (): SurfaceTheme[];
227
+ (options: _angular_core.InjectOptions & {
228
+ optional?: false;
229
+ }): SurfaceTheme[];
230
+ (options: _angular_core.InjectOptions): SurfaceTheme[] | null;
231
+ };
232
+ declare const ɵProvideSurfaceThemesPrefix: (valueOverride?: string | undefined) => _angular_core.Provider[];
233
+ declare const injectSurfaceThemesPrefix: {
234
+ (): string;
235
+ (options: _angular_core.InjectOptions & {
236
+ optional?: false;
237
+ }): string;
238
+ (options: _angular_core.InjectOptions): string | null;
239
+ };
240
+ declare const provideSurfaceThemesWithTailwind4: (themes: SurfaceTheme[], prefix?: string) => _angular_core.Provider[][];
241
+
242
+ declare const SURFACE_PROVIDER: InjectionToken<ProvideSurfaceDirective>;
243
+ declare class ProvideSurfaceDirective {
244
+ private themes;
245
+ private prefix;
246
+ private injector;
247
+ private currentProviderSync;
248
+ private forcedSurface;
249
+ surface: InputSignal<RegisteredSurfaceThemeName | null | undefined>;
250
+ effectiveSurface: _angular_core.Signal<string | null | undefined>;
251
+ resolvedTheme: _angular_core.Signal<SurfaceTheme | null>;
252
+ elevation: _angular_core.Signal<number>;
253
+ surfaceType: _angular_core.Signal<_ethlete_core.SurfaceType | null>;
254
+ surfaceName: _angular_core.Signal<string | undefined>;
255
+ protected surfaceClass: _angular_core.Signal<string>;
256
+ syncWithProvider(provider: ProvideSurfaceDirective): void;
257
+ stopSyncWithProvider(): void;
258
+ /** @internal */
259
+ forceSurface(surface: RegisteredSurfaceThemeName | null): void;
260
+ /** @internal */
261
+ clearForcedSurface(): void;
262
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProvideSurfaceDirective, never>;
263
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ProvideSurfaceDirective, "[etProvideSurface]", never, { "surface": { "alias": "etProvideSurface"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
264
+ }
265
+
266
+ declare class AutoSurfaceDirective {
267
+ private ownSurfaceProvider;
268
+ private contextSurfaceProvider;
269
+ private surfaceThemes;
270
+ private surfaceContextTracker;
271
+ /**
272
+ * Explicit surface provider to resolve the surface relative to. Falls back to the
273
+ * surface provider from the surrounding (trigger) context when not set.
274
+ */
275
+ surfaceProvider: _angular_core.InputSignal<ProvideSurfaceDirective | null>;
276
+ private consultsOverlayContext;
277
+ resolvedSurface: _angular_core.Signal<string | null>;
278
+ /**
279
+ * Opt this auto-surface out of the overlay surface-context tracker. An overlay
280
+ * *panel* (menu, select/date/cascader panel, tooltip, toggletip) is its overlay's
281
+ * own painted surface, so it must adopt the overlay elevation from its injector or
282
+ * explicit `surfaceProvider` — not stack a level above it. The tracker exists for
283
+ * content rendered *inside* such a panel, whose injector points back at the trigger
284
+ * location and therefore cannot see the overlay it visually lives in.
285
+ */
286
+ ignoreOverlaySurfaceContext(): void;
287
+ constructor();
288
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AutoSurfaceDirective, never>;
289
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AutoSurfaceDirective, "[etAutoSurface]", never, { "surfaceProvider": { "alias": "surfaceProvider"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof ProvideSurfaceDirective; inputs: {}; outputs: {}; }]>;
290
+ }
291
+
84
292
  type ThemeRGBColor = `${number} ${number} ${number}`;
85
293
  type ThemeHSLColor = `${number} ${number}% ${number}%`;
86
294
  type ThemeColor = ThemeRGBColor | ThemeHSLColor;
@@ -98,36 +306,69 @@ type OnThemeColorMap = {
98
306
  active?: ThemeColor;
99
307
  disabled?: ThemeColor;
100
308
  };
309
+ type ThemeInkColorMap = {
310
+ default: ThemeColor;
311
+ hover?: ThemeColor;
312
+ focus?: ThemeColor;
313
+ active?: ThemeColor;
314
+ disabled?: ThemeColor;
315
+ };
101
316
  type ThemeSwatch = {
102
317
  color: ThemeColorMap;
103
318
  onColor: OnThemeColorMap;
319
+ inkColor?: ThemeInkColorMap;
104
320
  };
105
- type Theme = {
321
+ type ColorThemeType = 'success' | 'warning' | 'error';
322
+ type ColorTheme = {
106
323
  name: string;
324
+ type?: ColorThemeType;
107
325
  isDefault?: boolean;
108
- isDefaultAlt?: boolean;
109
326
  primary: ThemeSwatch;
110
327
  secondary?: ThemeSwatch;
111
328
  tertiary?: ThemeSwatch;
112
329
  };
113
- declare const createCssThemeName: (name: string) => string;
114
- declare const ɵProvideColorThemes: (valueOverride?: (string | undefined)[] | undefined) => _angular_core.Provider[];
330
+ /**
331
+ * Augmentable registry for the literal set of color theme names an app defines. Left
332
+ * empty by default, which keeps theme-name-accepting APIs (like `etProvideColor`) typed
333
+ * as plain `string`.
334
+ *
335
+ * Apps that want those APIs checked and autocompleted against their own theme names
336
+ * should augment this interface once, near where their themes are defined:
337
+ *
338
+ * ```ts
339
+ * declare module '@ethlete/core' {
340
+ * interface EthleteColorThemeNameRegistry {
341
+ * name: 'pitch-green' | 'red' | 'light-grey';
342
+ * }
343
+ * }
344
+ * ```
345
+ */
346
+ interface EthleteColorThemeNameRegistry {
347
+ }
348
+ type RegisteredColorThemeName = EthleteColorThemeNameRegistry extends {
349
+ name: infer N extends string;
350
+ } ? N : string;
351
+ declare const createCssColorThemeName: (name: string) => string;
352
+ declare const ɵProvideColorThemes: (valueOverride?: (ColorTheme | undefined)[] | undefined) => _angular_core.Provider[];
115
353
  declare const injectColorThemes: {
116
- (): string[];
354
+ (): ColorTheme[];
117
355
  (options: _angular_core.InjectOptions & {
118
356
  optional?: false;
119
- }): string[];
120
- (options: _angular_core.InjectOptions): string[] | null;
357
+ }): ColorTheme[];
358
+ (options: _angular_core.InjectOptions): ColorTheme[] | null;
121
359
  };
122
- declare const ɵProvideThemesPrefix: (valueOverride?: string | undefined) => _angular_core.Provider[];
123
- declare const injectThemesPrefix: {
360
+ declare const ɵProvideColorThemesPrefix: (valueOverride?: string | undefined) => _angular_core.Provider[];
361
+ declare const injectColorThemesPrefix: {
124
362
  (): string;
125
363
  (options: _angular_core.InjectOptions & {
126
364
  optional?: false;
127
365
  }): string;
128
366
  (options: _angular_core.InjectOptions): string | null;
129
367
  };
130
- declare const provideColorThemesWithTailwind4: (themes: Theme[], prefix?: string) => _angular_core.Provider[][];
368
+ declare const provideColorThemesWithTailwind4: (themes: ColorTheme[], prefix?: string) => _angular_core.Provider[][];
369
+ declare const injectErrorTheme: () => ColorTheme;
370
+ declare const injectWarningTheme: () => ColorTheme;
371
+ declare const injectSuccessTheme: () => ColorTheme;
131
372
 
132
373
  /**
133
374
  * @deprecated Migrate to Tailwind v4. Intent to remove in v6.
@@ -136,11 +377,11 @@ declare const createSwatchCss: (swatch: string, isAlt: boolean, data: ThemeSwatc
136
377
  /**
137
378
  * @deprecated Migrate to Tailwind v4. Intent to remove in v6.
138
379
  */
139
- declare const createRootThemeCss: (themes: Theme[]) => void;
380
+ declare const createRootThemeCss: (themes: ColorTheme[]) => void;
140
381
  /**
141
382
  * @deprecated Migrate to Tailwind v4. Intent to remove in v6.
142
383
  */
143
- declare const createThemeStyle: (theme: Theme, isAlt: boolean) => void;
384
+ declare const createThemeStyle: (theme: ColorTheme, isAlt: boolean) => void;
144
385
  /**
145
386
  * @deprecated Migrate to Tailwind v4. Intent to remove in v6.
146
387
  */
@@ -152,7 +393,7 @@ declare const createTailwindRgbVar: (val: string | undefined) => string | null;
152
393
  /**
153
394
  * @deprecated Migrate to Tailwind v4. Intent to remove in v6.
154
395
  */
155
- declare const createTailwindColorThemes: (themes: Theme[], prefix?: string) => Record<string, {
396
+ declare const createTailwindColorThemes: (themes: ColorTheme[], prefix?: string) => Record<string, {
156
397
  DEFAULT: string;
157
398
  hover: string;
158
399
  focus: string;
@@ -162,34 +403,94 @@ declare const createTailwindColorThemes: (themes: Theme[], prefix?: string) => R
162
403
  /**
163
404
  * @deprecated Use provideColorThemesWithTailwind4 instead after migrating to Tailwind CSS v4. Intent to remove in v6.
164
405
  */
165
- declare const provideColorThemes: (themes: Theme[]) => _angular_core.Provider[][];
406
+ declare const provideColorThemes: (themes: ColorTheme[]) => _angular_core.Provider[][];
166
407
 
167
- declare const THEME_PROVIDER: InjectionToken<ProvideThemeDirective>;
168
- declare class ProvideThemeDirective {
408
+ declare const COLOR_PROVIDER: InjectionToken<ProvideColorDirective>;
409
+ /**
410
+ * The color provider attached to a bootstrapped root component (e.g. `ProvideColorDirective` in
411
+ * the app component's `hostDirectives`), if any. Detached DOM such as overlay panes can't reach
412
+ * it through element DI, so overlay containers fall back to this when resolving the provider to
413
+ * `syncWithProvider()` — resolve at sync time, not at injection time, since root components only
414
+ * register with `ApplicationRef` once bootstrap completes.
415
+ *
416
+ * @internal
417
+ */
418
+ declare const resolveAppRootColorProvider: (appRef: ApplicationRef) => ProvideColorDirective | null;
419
+ declare class ProvideColorDirective {
169
420
  private themes;
170
421
  private prefix;
171
422
  private injector;
423
+ private parentProvider;
172
424
  private currentProviderSync;
173
- mainTheme: _angular_core.InputSignal<string | null | undefined>;
174
- altTheme: _angular_core.InputSignal<string | null | undefined>;
175
- mainThemeName: _angular_core.Signal<string | undefined>;
176
- altThemeName: _angular_core.Signal<string | undefined>;
425
+ private forcedColor;
426
+ color: InputSignal<RegisteredColorThemeName | ColorTheme | null | undefined>;
427
+ effectiveColor: _angular_core.Signal<string | ColorTheme | null | undefined>;
428
+ /**
429
+ * The color that actually applies at this provider's location: its own effective color, or —
430
+ * when this provider is passive (no input, nothing forced) — the nearest ancestor provider's.
431
+ * Mirrors the CSS cascade, which falls through a provider's `-color--inherited` scope class;
432
+ * consumers that re-apply context across detached DOM (overlay panes) must use this instead
433
+ * of `effectiveColor` or a passive in-between provider (e.g. a form field's) erases the theme.
434
+ */
435
+ resolvedColor: _angular_core.Signal<string | ColorTheme | null | undefined>;
436
+ colorName: _angular_core.Signal<string | undefined>;
177
437
  protected themeClass: _angular_core.Signal<string>;
178
- syncWithProvider(provider: ProvideThemeDirective): void;
438
+ syncWithProvider(provider: ProvideColorDirective): void;
179
439
  stopSyncWithProvider(): void;
180
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProvideThemeDirective, never>;
181
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ProvideThemeDirective, "[etProvideTheme]", never, { "mainTheme": { "alias": "etProvideTheme"; "required": false; "isSignal": true; }; "altTheme": { "alias": "etProvideAltTheme"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
440
+ /** @internal */
441
+ forceColor(color: RegisteredColorThemeName | ColorTheme | null): void;
442
+ /** @internal */
443
+ clearForcedColor(): void;
444
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProvideColorDirective, never>;
445
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ProvideColorDirective, "[etProvideColor]", never, { "color": { "alias": "etProvideColor"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
446
+ }
447
+
448
+ type SurfaceContextEntry = {
449
+ id: string;
450
+ type: SurfaceType;
451
+ elevation: number;
452
+ };
453
+ type SurfaceContextTracker = {
454
+ topType: Signal<SurfaceType | null>;
455
+ topElevation: Signal<number>;
456
+ register: (type: SurfaceType, elevation: number) => () => void;
457
+ };
458
+ declare const provideSurfaceContextTracker: () => _angular_core.Provider[];
459
+ declare const injectSurfaceContextTracker: {
460
+ (): SurfaceContextTracker;
461
+ (options: _angular_core.InjectOptions & {
462
+ optional?: false;
463
+ }): SurfaceContextTracker;
464
+ (options: _angular_core.InjectOptions): SurfaceContextTracker | null;
465
+ };
466
+
467
+ /**
468
+ * Same shape as `ColorInteractiveDirective` — reacts to its own `:hover`/`:focus-visible`/
469
+ * `:active`/`[disabled]` — but drives `--et-surface-interaction-*`, a neutral/muted tint, instead
470
+ * of the ambient color theme. Use it for chrome-level interaction feedback that shouldn't borrow
471
+ * the page's brand color (a tab trigger's hover state, a toggle button that should look neutral
472
+ * until it's actually active — see `ButtonDirective`'s `mutedUntilPressed`).
473
+ *
474
+ * Has no container/exclude/has-focus variants: it has no descendant-cascading CSS at all, so
475
+ * applying it to a wrapper with independently-interactive children is safe by construction —
476
+ * unlike `ColorInteractiveDirective`, there's no bubbling-leak failure mode to worry about here.
477
+ */
478
+ declare class SurfaceInteractiveDirective {
479
+ private styleManager;
480
+ constructor();
481
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SurfaceInteractiveDirective, never>;
482
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SurfaceInteractiveDirective, "[etSurfaceInteractive]", never, {}, {}, never, never, true, never>;
182
483
  }
183
484
 
184
485
  type AnimatedOverlayComponentBase = {
185
486
  animatedLifecycle: Signal<AnimatedLifecycleDirective | undefined>;
186
- setThemeFromProvider: (provider: ProvideThemeDirective) => void;
487
+ setColorFromProvider: (provider: ProvideColorDirective) => void;
187
488
  };
188
489
  type AnimatedOverlayMountConfig<T> = {
189
490
  component: ComponentType<T>;
190
491
  providers?: StaticProvider[];
191
492
  data?: Partial<T>;
192
- themeProvider?: ProvideThemeDirective | null;
493
+ colorProvider?: ProvideColorDirective | null;
193
494
  };
194
495
  type AnimatedOverlayState = 'init' | 'mounting' | 'mounted' | 'unmounting' | 'unmounted';
195
496
  declare class AnimatedOverlayDirective<T extends AnimatedOverlayComponentBase> {
@@ -240,7 +541,7 @@ declare class AnimatedOverlayDirective<T extends AnimatedOverlayComponentBase> {
240
541
  mount(config: AnimatedOverlayMountConfig<T>): T | undefined;
241
542
  unmount(): void;
242
543
  private applyComponentData;
243
- private applyThemeProvider;
544
+ private applyColorProvider;
244
545
  private updateOverlaySize;
245
546
  private setupFloatingUI;
246
547
  private getFloatingArrow;
@@ -335,574 +636,432 @@ declare class RepeatDirective {
335
636
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RepeatDirective, "[etRepeat]", never, { "repeatCount": { "alias": "etRepeat"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
336
637
  }
337
638
 
338
- declare const createComponentId: (prefix: string) => string;
639
+ declare class ScrollObserverEndDirective {
640
+ private elementRef;
641
+ private host;
642
+ constructor();
643
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ScrollObserverEndDirective, never>;
644
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ScrollObserverEndDirective, "[etScrollObserverEnd]", never, {}, {}, never, never, true, never>;
645
+ }
339
646
 
340
- declare const createDestroy: () => rxjs.Observable<boolean>;
647
+ declare class ScrollObserverStartDirective {
648
+ private elementRef;
649
+ private host;
650
+ constructor();
651
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ScrollObserverStartDirective, never>;
652
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ScrollObserverStartDirective, "[etScrollObserverStart]", never, {}, {}, never, never, true, never>;
653
+ }
341
654
 
342
- declare const injectHostElement: <T = HTMLElement>() => T;
343
- declare const injectTemplateRef: <C = unknown>() => TemplateRef<C>;
344
- type CreateProviderOptions = {
655
+ type SignalElementBindingComplexType = HTMLElement | ElementRef<HTMLElement> | QueryList<ElementRef<HTMLElement> | HTMLElement> | Array<ElementRef<HTMLElement> | HTMLElement> | null | undefined;
656
+ type SignalElementBindingType = HTMLElement | ElementRef<HTMLElement> | Observable<SignalElementBindingComplexType> | Signal<SignalElementBindingComplexType> | QueryList<ElementRef<HTMLElement> | HTMLElement> | ElementSignal;
657
+ type ElementSignal = Signal<{
658
+ currentElements: HTMLElement[];
659
+ previousElements: HTMLElement[];
660
+ }>;
661
+ type ElementSignalValue = ReturnType<ElementSignal>;
662
+ declare const isElementSignal: (el: unknown) => el is ElementSignal;
663
+ declare const createDocumentElementSignal: () => ElementSignal;
664
+ declare const createEmptyElementSignal: () => ElementSignal;
665
+ declare const buildElementSignal: (el: SignalElementBindingType | null | undefined) => ElementSignal;
666
+ declare const firstElementSignal: (el: ElementSignal) => Signal<{
667
+ currentElement: HTMLElement | null;
668
+ previousElement: HTMLElement | null;
669
+ }>;
670
+
671
+ type AnimatedSizeAxis = 'block' | 'inline';
672
+ type AnimatedBlockSizeConfig = {
673
+ /** The element whose size is animated. Defaults to the host `ElementRef`. */
674
+ host?: SignalElementBindingType;
345
675
  /**
346
- * Optional name for the provider, useful for debugging.
347
- * If not provided, the name will be a generated string.
676
+ * The content element(s) whose size changes drive the animation. Observe the content (children),
677
+ * **not** the animated host — observing the host would feed the animation back into itself.
678
+ * For the `inline` axis this also means the observed content must be content-sized (e.g.
679
+ * `inline-size: max-content`); a plain block child just mirrors the host's animated width back.
348
680
  */
349
- name?: string;
681
+ observe: SignalElementBindingType | SignalElementBindingType[];
350
682
  /**
351
- * Optional existing InjectionToken to also provide the created provider under.
683
+ * The axes to animate. May be a signal — e.g. to drop the `inline` axis while a panel is in a
684
+ * presentation whose width follows the viewport instead of its content. @default ['block']
352
685
  */
353
- extraInjectionToken?: InjectionToken<unknown>;
686
+ axes?: AnimatedSizeAxis[] | Signal<AnimatedSizeAxis[]>;
687
+ /** Animation duration in ms. @default 160 */
688
+ duration?: number;
689
+ /** Animation easing. @default 'ease' */
690
+ easing?: string;
691
+ /** Class toggled on the host while animating — use it to `overflow: clip` during the resize. */
692
+ resizingClass?: string;
354
693
  };
355
- type ProviderResult<T> = readonly [
356
- provide: () => Provider[],
357
- inject: {
358
- (): T;
359
- (options: InjectOptions & {
360
- optional?: false;
361
- }): T;
362
- (options: InjectOptions): T | null;
363
- },
364
- token: InjectionToken<T>
365
- ];
366
- type StaticProviderResult<T> = readonly [
367
- provide: (valueOverride?: Partial<T>) => Provider[],
368
- inject: {
369
- (): T;
370
- (options: InjectOptions & {
371
- optional?: false;
372
- }): T;
373
- (options: InjectOptions): T | null;
374
- },
375
- token: InjectionToken<T>
376
- ];
377
- type RootProviderResult<T> = readonly [
378
- inject: {
379
- (): T;
380
- (options: InjectOptions & {
381
- optional?: false;
382
- }): T;
383
- (options: InjectOptions): T | null;
384
- },
385
- token: InjectionToken<T>
386
- ];
387
- declare const createProvider: <T>(factory: () => T, options?: CreateProviderOptions) => ProviderResult<T>;
388
- declare const createRootProvider: <T>(factory: () => T, options?: CreateProviderOptions) => ProviderResult<T>;
389
- declare const createStaticProvider: <T>(defaultValue?: T, options?: CreateProviderOptions) => StaticProviderResult<T>;
390
- declare const createStaticRootProvider: <T>(defaultValue?: T, options?: CreateProviderOptions) => StaticProviderResult<T>;
391
-
392
- declare const cloneFormGroup: <T extends FormGroup<any>>(formGroup: T) => T;
393
- declare const getFormGroupValue: <T extends FormGroup>(formGroup: T) => Record<string, unknown>;
394
-
395
- declare const createRxHostListener: <K extends keyof HTMLElementEventMap>(eventName: K, options?: EventListenerOptions) => rxjs.Observable<HTMLElementEventMap[K]>;
396
- declare const applyHostListener: <K extends keyof HTMLElementEventMap>(eventName: K, handler: (event: HTMLElementEventMap[K]) => void, options?: EventListenerOptions) => rxjs.Subscription;
397
- declare const applyHostListeners: (listeners: Partial<{ [K in keyof HTMLElementEventMap]: (event: HTMLElementEventMap[K]) => void; }>, options?: EventListenerOptions) => void;
398
-
399
- declare class TypedQueryList<T> extends QueryList<T> {
400
- get changes(): Observable<TypedQueryList<T>>;
401
- }
402
- declare function switchQueryListChanges(): <T extends TypedQueryList<unknown> | null | undefined>(source: Observable<T>) => Observable<T>;
403
-
404
694
  /**
405
- * Sets the value of an input signal.
406
- * See issue: https://github.com/angular/angular/issues/54782
695
+ * Smoothly animates an element's `block-size` (and optionally `inline-size`, via `axes`) when its
696
+ * content changes size (e.g. a list filtering, a loading state resolving, a column being added).
697
+ * Set up once in an injection context; it observes the given content element(s) and animates the
698
+ * host from its previous size to its new natural size.
699
+ *
700
+ * Robustness notes: the baseline size is captured on the first render (via `afterNextRender`) and
701
+ * only later changes animate, so the initial layout settling never plays as a grow-from-0.
702
+ * A change that interrupts an in-flight animation continues from the current animated size, and
703
+ * zero/pre-layout measurements are ignored. Respects `prefers-reduced-motion`.
704
+ *
705
+ * The animation starts synchronously inside the `ResizeObserver` callback — it runs after layout
706
+ * but **before paint**, so the host never paints a frame at its new natural size. Routing the
707
+ * resize through a signal + effect instead would apply the animation one change-detection cycle
708
+ * (= one painted frame) late: a growing panel would flash at its final size, snap back, and only
709
+ * then animate.
407
710
  */
408
- declare const setInputSignal: <T>(input: InputSignal<T> | InputSignalWithTransform<T, unknown>, value: T) => void;
409
-
410
- type NgClassType = string | string[] | Set<string> | {
411
- [klass: string]: any;
412
- } | null | undefined;
711
+ declare const injectAnimatedBlockSize: (config: AnimatedBlockSizeConfig) => void;
413
712
 
414
- declare const AT_LEAST_ONE_REQUIRED = "atLeastOneRequired";
415
- type ValidateAtLeastOneRequiredConfig = {
713
+ declare const previousSignalValue: <T>(signal: Signal<T>) => Signal<T | undefined>;
714
+ type SyncSignalOptions = {
416
715
  /**
417
- * Keys of form controls to validate in the supplied form group
716
+ * If true, the target signal will not be updated with the source signal's value in a sync operation.
717
+ * This should be set to true for signals that need to be initialized first before syncing (eg. required inputs)
718
+ * @default false
418
719
  */
419
- keys: string[];
720
+ skipSyncRead?: boolean;
420
721
  /**
421
- * If true, the value `false` will result in a validation error
722
+ * If true, the first time the effect will be triggered will be skipped.
422
723
  * @default false
423
724
  */
424
- checkFalse?: boolean;
425
- };
426
- declare const ValidateAtLeastOneRequired: (config: ValidateAtLeastOneRequiredConfig) => ValidatorFn;
427
- declare const IS_ARRAY_NOT_EMPTY = "isArrayNotEmpty";
428
- declare const IsArrayNotEmpty: (control: AbstractControl) => ValidationErrors | null;
429
- declare const IS_EMAIL = "isEmail";
430
- declare const IsEmail: (control: AbstractControl) => ValidationErrors | null;
431
- declare const MUST_MATCH = "mustMatch";
432
- declare const MustMatch: (controlName: string, matchingControlName: string) => (formGroup: AbstractControl) => {
433
- mustMatch: boolean;
434
- } | null;
435
- declare const Validators: {
436
- readonly MustMatch: (controlName: string, matchingControlName: string) => (formGroup: AbstractControl) => {
437
- mustMatch: boolean;
438
- } | null;
439
- readonly IsEmail: (control: AbstractControl) => ValidationErrors | null;
440
- readonly IsArrayNotEmpty: (control: AbstractControl) => ValidationErrors | null;
441
- readonly ValidateAtLeastOneRequired: (config: ValidateAtLeastOneRequiredConfig) => ValidatorFn;
442
- };
443
-
444
- declare const clone: <T>(original: T) => T;
445
- declare const equal: (foo: any, bar: any) => boolean;
446
-
447
- declare const hasCookie: (name: string) => boolean;
448
- declare const getCookie: (name: string) => string | null | undefined;
449
- declare const setCookie: (name: string, data: string, expiresInDays?: number | null, domain?: string | null, path?: string, sameSite?: "strict" | "none" | "lax") => void;
450
- declare const deleteCookie: (name: string, path?: string, domain?: string | null) => void;
451
- declare const getDomain: () => string | null;
452
-
453
- type Translatable = {
454
- i18n: string;
455
- text: string;
456
- };
457
-
458
- declare class KeyPressManager {
459
- readonly key: number;
460
- private readonly _isKeyPressed$;
461
- private readonly _keyPressCount$;
462
- private readonly _stopTimeout$;
463
- constructor(key: number);
464
- isPressed(event: KeyboardEvent): boolean;
465
- clear(): void;
466
- }
467
-
468
- declare const DISABLE_LOGGER_PARAM = "et-logger-quiet";
469
- type CreateLoggerConfig = {
470
- scope: string;
471
- feature: string;
472
- };
473
- declare const createLogger: (config: CreateLoggerConfig) => {
474
- log: (...args: unknown[]) => void;
475
- warn: (...args: unknown[]) => void;
476
- error: (...args: unknown[]) => void;
725
+ skipFirstRun?: boolean;
477
726
  };
478
-
479
- declare const clamp: (value: number, min?: number, max?: number) => number;
480
- declare const round: (value: number, precision?: number) => number;
481
-
482
- declare const isObject: (value: unknown) => value is Record<string, unknown>;
483
- declare const isArray: (value: unknown) => value is unknown[];
484
- declare const getObjectProperty: (obj: Record<string, unknown>, prop: string) => unknown;
485
-
486
- declare const RUNTIME_ERROR_NO_DATA = "__ET_NO_DATA__";
487
- declare class RuntimeError<T extends number> extends Error {
488
- code: T;
489
- devOnly: boolean;
490
- data: unknown;
491
- constructor(code: T, message: null | false | string, devOnly?: boolean, data?: unknown);
492
- }
493
- declare function formatRuntimeError<T extends number>(code: T, message: null | false | string, devOnly: boolean): string;
494
-
727
+ declare const syncSignal: <T>(from: Signal<T>, to: WritableSignal<T>, options?: SyncSignalOptions) => _angular_core.EffectRef;
728
+ type MaybeSignal<T> = T | Signal<T>;
729
+ declare const maybeSignalValue: <T>(value: MaybeSignal<T>) => T;
495
730
  /**
496
- * Checks if an element or the viewport can scroll in a given direction.
497
- * @param element The element to check. If null/undefined, checks if the viewport can scroll.
498
- * @param direction The direction to check. If not provided, checks both directions.
499
- * @returns true if the element or viewport can scroll in the given direction.
731
+ * A computed that will only be reactive until the source signal contains a truthy value.
732
+ * All subsequent changes inside the computation will be ignored.
500
733
  */
501
- declare const elementCanScroll: (element?: HTMLElement | null, direction?: "x" | "y") => boolean;
502
- type IsElementVisibleOptions = {
503
- /**
504
- * The element to check if it is visible inside a container.
505
- */
506
- element?: HTMLElement | null;
507
- /**
508
- * The container to check if the element is visible inside.
509
- * If null or undefined, uses the viewport as the container.
510
- * @default null (viewport)
511
- */
512
- container?: HTMLElement | null;
513
- /**
514
- * The container's rect to check if the element is visible inside. Can be supplied to reduce the amount of DOM reads.
515
- * Only used when container is provided and not null.
516
- * @default container.getBoundingClientRect()
517
- */
518
- containerRect?: DOMRect | null;
519
- /**
520
- * The element's rect. Can be supplied to reduce the amount of DOM reads.
521
- * @default element.getBoundingClientRect()
522
- */
523
- elementRect?: DOMRect | null;
524
- };
525
- type CurrentElementVisibility = {
526
- /**
527
- * Whether the element is visible in the inline direction.
528
- */
529
- inline: boolean;
530
- /**
531
- * Whether the element is visible in the block direction.
532
- */
533
- block: boolean;
534
- /**
535
- * The percentage of the element that is visible in the inline direction.
536
- */
537
- inlineIntersection: number;
734
+ declare const computedTillTruthy: <T>(source: Signal<T>) => Signal<T | null>;
735
+ /**
736
+ * A computed that will only be reactive until the source signal contains a falsy value.
737
+ * All subsequent changes inside the computation will be ignored.
738
+ */
739
+ declare const computedTillFalsy: <T>(source: Signal<T>) => Signal<T | null>;
740
+ /**
741
+ * A writeable signal that will be set to the provided value once all inputs are set.
742
+ * During that time, the signal will be set to `null`.
743
+ */
744
+ declare const deferredSignal: <T extends () => unknown>(valueFn: T) => WritableSignal<ReturnType<T> | null>;
745
+ declare const memoizeSignal: <T>(factory: () => Signal<T>) => () => Signal<T>;
746
+
747
+ type SignalAnimatedNumberOptions = {
538
748
  /**
539
- * The percentage of the element that is visible in the block direction.
749
+ * The initial value to start animating from.
750
+ * If not provided, the animation will start from 0
540
751
  */
541
- blockIntersection: number;
752
+ initialValue?: number;
542
753
  /**
543
- * Whether the element is intersecting the container.
754
+ * Duration of the animation in milliseconds.
755
+ * @default 1000
544
756
  */
545
- isIntersecting: boolean;
757
+ duration?: number;
546
758
  /**
547
- * The ratio of the element that is intersecting the container.
759
+ * Easing function that takes a progress value (0 to 1) and returns an eased value (0 to 1).
760
+ * Options:
761
+ * - `easeLinear()`
762
+ * - `easeIn()`
763
+ * - `easeOut()`
764
+ * - `easeInOut()`
765
+ * - `easeElastic()`
766
+ * - `easeOutBack()`
767
+ * - `easeOutBackStrong()`
768
+ * @default easeOut()
548
769
  */
549
- intersectionRatio: number;
770
+ easing?: (t: number) => number;
550
771
  /**
551
- * The element that is being checked for visibility.
772
+ * Function to round the animated value.
773
+ * @default (v: number) => Math.round(v)
552
774
  */
553
- element: HTMLElement;
775
+ round?: (value: number) => number;
554
776
  /**
555
- * The container's rect used for the calculation.
777
+ * Callback invoked when the animation starts.
556
778
  */
557
- containerRect: DOMRect;
779
+ onAnimationStart?: () => void;
558
780
  /**
559
- * The element's rect used for the calculation.
781
+ * Callback invoked when the animation ends.
560
782
  */
561
- elementRect: DOMRect;
783
+ onAnimationEnd?: () => void;
562
784
  };
563
- declare const isElementVisible: (options: IsElementVisibleOptions) => CurrentElementVisibility | null;
564
- declare const getElementScrollCoordinates: (options: ScrollToElementOptions) => ScrollToOptions;
565
- type ScrollToElementOptions = {
566
- /**
567
- * The element to scroll to.
568
- */
569
- element?: HTMLElement | null;
570
- /**
571
- * The scroll container to scroll to the element in.
572
- * Must be provided - cannot scroll the viewport programmatically with this function.
573
- */
574
- container?: HTMLElement | null;
575
- /**
576
- * The direction to scroll in.
577
- * @default 'both'
578
- */
579
- direction?: 'inline' | 'block' | 'both';
580
- /**
581
- * The origin of the element to scroll to.
582
- * @default 'nearest'
583
- */
584
- origin?: 'start' | 'end' | 'center' | 'nearest';
785
+ type AnimatedNumberSignal = Signal<number> & {
585
786
  /**
586
- * The scroll behavior.
587
- * @default 'smooth'
787
+ * Starts the animation from the current value to the target value.
788
+ * @returns The animated signal for chaining
588
789
  */
589
- behavior?: ScrollBehavior;
790
+ play: () => AnimatedNumberSignal;
590
791
  /**
591
- * The scroll inline-margin
592
- * @default 0
792
+ * Resets the animation to the initial value and stops any ongoing animation.
793
+ * @returns The animated signal for chaining
593
794
  */
594
- scrollInlineMargin?: number;
795
+ reset: () => AnimatedNumberSignal;
595
796
  /**
596
- * The scroll block-margin
597
- * @default 0
797
+ * Stops the current animation at its current position.
798
+ * @returns The animated signal for chaining
598
799
  */
599
- scrollBlockMargin?: number;
800
+ stop: () => AnimatedNumberSignal;
600
801
  };
601
- declare const scrollToElement: (options: ScrollToElementOptions) => void;
802
+ /**
803
+ * Creates a signal that animates the transition of a numeric signal's value over time.
804
+ */
805
+ declare const signalAnimatedNumber: (source: MaybeSignal<number>, options?: SignalAnimatedNumberOptions) => AnimatedNumberSignal;
806
+ declare const easeLinear: (t: number) => number;
807
+ declare const easeIn: (t: number) => number;
808
+ declare const easeOut: (t: number) => number;
809
+ declare const easeInOut: (t: number) => number;
810
+ /** Elastic easing function (overshoots) */
811
+ declare const easeElastic: (t: number) => number;
812
+ /** Back easing function (overshoots slightly then settles) */
813
+ declare const easeOutBack: (t: number) => number;
814
+ /** Back easing function with more overshoot */
815
+ declare const easeOutBackStrong: (t: number) => number;
602
816
 
603
- declare class NormalizeGameResultTypePipe implements PipeTransform {
604
- transform: (type: string | null) => NormalizedGameResultType | null;
605
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<NormalizeGameResultTypePipe, never>;
606
- static ɵpipe: _angular_core.ɵɵPipeDeclaration<NormalizeGameResultTypePipe, "etNormalizeGameResultType", true>;
607
- }
608
- type NormalizedGameResultType = Translatable & {
609
- shortCode: string;
817
+ type Vec2 = [number, number];
818
+ type ViewportConfig = {
819
+ breakpoints: {
820
+ xs: Vec2;
821
+ sm: Vec2;
822
+ md: Vec2;
823
+ lg: Vec2;
824
+ xl: Vec2;
825
+ '2xl': Vec2;
826
+ };
610
827
  };
611
- declare const normalizeGameResultType: (type: string | null) => NormalizedGameResultType | null;
612
-
613
- declare class NormalizeMatchParticipantsPipe implements PipeTransform {
614
- transform: (match: MatchListView | null) => NormalizedMatchParticipants | null;
615
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<NormalizeMatchParticipantsPipe, never>;
616
- static ɵpipe: _angular_core.ɵɵPipeDeclaration<NormalizeMatchParticipantsPipe, "etNormalizeMatchParticipants", true>;
617
- }
618
- type NormalizedMatchParticipants = {
619
- home: NormalizedMatchParticipant | null;
620
- away: NormalizedMatchParticipant | null;
828
+ type Breakpoint = keyof ViewportConfig['breakpoints'];
829
+ declare const BREAKPOINT_ORDER: Breakpoint[];
830
+ /**
831
+ * Default viewport config based on Tailwind CSS.
832
+ * @see https://tailwindcss.com/docs/screens
833
+ */
834
+ declare const DEFAULT_VIEWPORT_CONFIG: ViewportConfig;
835
+ declare const provideViewportConfig: (valueOverride?: Partial<ViewportConfig> | undefined) => _angular_core.Provider[];
836
+ declare const injectViewportConfig: {
837
+ (): ViewportConfig;
838
+ (options: _angular_core.InjectOptions & {
839
+ optional?: false;
840
+ }): ViewportConfig;
841
+ (options: _angular_core.InjectOptions): ViewportConfig | null;
621
842
  };
622
- type NormalizedParticipantType = 'team' | 'player' | 'unknown';
623
- type NormalizedMatchParticipant = ({
624
- type: 'tbd';
625
- participantType: NormalizedParticipantType;
626
- data: ParticipantViewUnion | null;
627
- } & Translatable) | {
628
- type: 'participant';
629
- participantType: NormalizedParticipantType;
630
- data: ParticipantViewUnion;
631
- } | ({
632
- type: 'none';
633
- participantType: NormalizedParticipantType;
634
- data: ParticipantViewUnion | null;
635
- } & Translatable);
636
- declare const normalizeMatchParticipants: (match: MatchListView | null) => NormalizedMatchParticipants | null;
637
- declare const normalizeMatchParticipant: (match: MatchListView | null, side: "home" | "away") => NormalizedMatchParticipant | null;
638
-
639
- declare class NormalizeMatchScorePipe implements PipeTransform {
640
- transform: (match: MatchListView | null | undefined) => NormalizedMatchScore | null;
641
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<NormalizeMatchScorePipe, never>;
642
- static ɵpipe: _angular_core.ɵɵPipeDeclaration<NormalizeMatchScorePipe, "etNormalizeMatchScore", true>;
643
- }
644
- declare const enum MatchStateType {
645
- PREPARING_ROUND = "preparingRound",
646
- PRE_MATCH = "preMatch",
647
- LIVE = "live",
648
- POST_MATCH = "postMatch",
649
- AUTO_WIN = "autoWin"
650
- }
651
- type NormalizedMatchScore = {
652
- home: {
653
- score: string | number | null;
654
- isWinner: boolean;
655
- };
656
- away: {
657
- score: string | number | null;
658
- isWinner: boolean;
659
- };
660
- subLine: string | null;
661
- isNumeric: boolean;
843
+ type BuildMediaQueryOptions = {
844
+ min?: number | Breakpoint;
845
+ max?: number | Breakpoint;
662
846
  };
663
- declare const normalizeMatchScore: (match: MatchListView | null | undefined) => NormalizedMatchScore | null;
664
- declare const isKnockoutMatch: (match: MatchListView | null | undefined) => boolean;
665
- declare const isGroupMatch: (match: MatchListView | null | undefined) => boolean;
666
- declare const getKnockoutMatchScore: (score: MatchRankingView | null | undefined) => "match-score.knockout.won" | "match-score.knockout.lost" | "match-score.knockout.tie" | null;
667
- declare const getMatchScoreSubLine: (match: MatchListView | null | undefined) => "match-score.groups.sub-line" | null;
668
- declare const getGroupMatchScore: (match: MatchListView | null | undefined) => {
669
- home: {
670
- score: number;
671
- isWinner: boolean;
847
+ declare const provideBreakpointObserver: () => _angular_core.Provider[];
848
+ declare const injectBreakpointObserver: {
849
+ (): {
850
+ observeBreakpoint: (options: BuildMediaQueryOptions) => _angular_core.Signal<boolean>;
851
+ isBreakpointMatched: (options: BuildMediaQueryOptions) => boolean;
852
+ getBreakpointSize: (type: Breakpoint, option: "min" | "max") => number;
853
+ buildMediaQueryString: (options: BuildMediaQueryOptions) => string;
854
+ observeMediaQuery: (mediaQuery: string) => _angular_core.Signal<boolean>;
855
+ isMediaQueryMatched: (mediaQuery: string) => boolean;
672
856
  };
673
- away: {
674
- score: number;
675
- isWinner: boolean;
857
+ (options: _angular_core.InjectOptions & {
858
+ optional?: false;
859
+ }): {
860
+ observeBreakpoint: (options: BuildMediaQueryOptions) => _angular_core.Signal<boolean>;
861
+ isBreakpointMatched: (options: BuildMediaQueryOptions) => boolean;
862
+ getBreakpointSize: (type: Breakpoint, option: "min" | "max") => number;
863
+ buildMediaQueryString: (options: BuildMediaQueryOptions) => string;
864
+ observeMediaQuery: (mediaQuery: string) => _angular_core.Signal<boolean>;
865
+ isMediaQueryMatched: (mediaQuery: string) => boolean;
676
866
  };
677
- } | null;
678
- declare const getGroupMatchPoints: (match: MatchListView | null | undefined) => {
679
- home: {
680
- score: number;
681
- isWinner: boolean;
682
- };
683
- away: {
684
- score: number;
685
- isWinner: boolean;
686
- };
687
- } | null;
688
-
689
- declare class NormalizeMatchStatePipe implements PipeTransform {
690
- transform: (match: MatchListView | null | undefined) => MatchStateType | null;
691
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<NormalizeMatchStatePipe, never>;
692
- static ɵpipe: _angular_core.ɵɵPipeDeclaration<NormalizeMatchStatePipe, "etNormalizeMatchState", true>;
693
- }
694
- declare const normalizeMatchState: (match: MatchListView | null | undefined) => MatchStateType | null;
867
+ (options: _angular_core.InjectOptions): {
868
+ observeBreakpoint: (options: BuildMediaQueryOptions) => _angular_core.Signal<boolean>;
869
+ isBreakpointMatched: (options: BuildMediaQueryOptions) => boolean;
870
+ getBreakpointSize: (type: Breakpoint, option: "min" | "max") => number;
871
+ buildMediaQueryString: (options: BuildMediaQueryOptions) => string;
872
+ observeMediaQuery: (mediaQuery: string) => _angular_core.Signal<boolean>;
873
+ isMediaQueryMatched: (mediaQuery: string) => boolean;
874
+ } | null;
875
+ };
695
876
 
696
- declare class NormalizeMatchTypePipe implements PipeTransform {
697
- transform: (matchType: StageType | null | undefined) => Translatable | null;
698
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<NormalizeMatchTypePipe, never>;
699
- static ɵpipe: _angular_core.ɵɵPipeDeclaration<NormalizeMatchTypePipe, "etNormalizeMatchType", true>;
700
- }
701
- declare const normalizeMatchType: (matchType: StageType | null | undefined) => Translatable | null;
877
+ type BreakpointMap<T> = Partial<Record<Breakpoint, T>>;
878
+ type BreakpointInput<T> = T | BreakpointMap<T>;
879
+ declare const breakpointTransformBase: <T, WriteT = BreakpointInput<T>>(coerce: (value: WriteT) => T) => ((value: WriteT) => T);
880
+ /**
881
+ * Transform factory for boolean inputs.
882
+ * Coerces plain values with `booleanAttribute`; resolves {@link BreakpointMap} mobile-first.
883
+ *
884
+ * @example
885
+ * snap = input(false, { transform: boolBreakpointTransform() });
886
+ * // Template: `snap` | `[snap]="true"` | `[snap]="{ xs: false, md: true }"`
887
+ */
888
+ declare const boolBreakpointTransform: () => ((value: BreakpointInput<boolean> | string) => boolean);
889
+ /**
890
+ * Transform factory for number inputs.
891
+ * Coerces plain values with `numberAttribute`; resolves {@link BreakpointMap} mobile-first.
892
+ *
893
+ * @example
894
+ * scrollMargin = input(0, { transform: numberBreakpointTransform() });
895
+ * // Template: `[scrollMargin]="16"` | `[scrollMargin]="{ xs: 0, md: 16 }"`
896
+ */
897
+ declare const numberBreakpointTransform: () => ((value: BreakpointInput<number> | string) => number);
898
+ /**
899
+ * Transform factory for any typed input (string unions, arrays, objects, etc.).
900
+ * Passes plain values through as-is; resolves {@link BreakpointMap} mobile-first.
901
+ * A value is treated as a {@link BreakpointMap} only when all its keys are valid breakpoint names.
902
+ *
903
+ * @example
904
+ * itemSize = input('auto', { transform: typedBreakpointTransform<ScrollableItemSize>() });
905
+ * tags = input([], { transform: typedBreakpointTransform<string[]>() });
906
+ * // Template: `[itemSize]="'third'"` | `[itemSize]="{ xs: 'full', md: 'third' }"`
907
+ */
908
+ declare const typedBreakpointTransform: <T>() => ((value: BreakpointInput<T>) => T);
909
+ type BoolBreakpointSignal = InputSignalWithTransform<boolean, BreakpointInput<boolean> | string>;
910
+ type NumberBreakpointSignal = InputSignalWithTransform<number, BreakpointInput<number> | string>;
911
+ type TypedBreakpointSignal<T> = InputSignalWithTransform<T, BreakpointInput<T>>;
912
+ declare const injectBreakpointInput: <T>(inputSignal: Signal<BreakpointInput<T>>, defaultValue: T) => Signal<T>;
913
+ declare const booleanBreakpointAttribute: (value: unknown) => BreakpointInput<boolean>;
914
+ declare const numberBreakpointAttribute: (value: unknown) => BreakpointInput<number>;
915
+ declare const BREAKPOINT_INSTANCE_TOKEN: InjectionToken<unknown>;
916
+ declare const provideBreakpointInstance: (componentClass: unknown) => {
917
+ provide: InjectionToken<unknown>;
918
+ useExisting: unknown;
919
+ };
702
920
 
703
- declare class InferMimeTypePipe implements PipeTransform {
704
- transform: (srcset: string) => "image/avif" | "image/bmp" | "image/gif" | "image/vdn.microsoft.icon" | "image/jpeg" | "image/png" | "image/svg+xml" | "image/tiff" | "image/webp" | "audio/aac" | "application/x-abiword" | "application/x-freearc" | "video/x-msvideo" | "application/vnd.amazon.ebook" | "application/octet-stream" | "application/x-bzip" | "application/x-bzip2" | "application/x-cdf" | "application/x-csh" | "text/css" | "text/csv" | "application/msword" | "application/vnd.openxmlformats-officedocument.wordprocessingml.document" | "application/vnd.ms-fontobject" | "application/epub+zip" | "application/gzip" | "text/html" | "text/calendar" | "application/java-archive" | "text/javascript" | "application/json" | "application/ld+json" | "audio/midi" | "audio/mpeg" | "video/mp4" | "video/mpeg" | "tapplication/vnd.apple.installer+xml" | "application/vnd.oasis.opendocument.presentation" | "application/vnd.oasis.opendocument.spreadsheet" | "application/vnd.oasis.opendocument.text" | "audio/ogg" | "video/ogg" | "application/ogg" | "audio/opus" | "font/otf" | "application/pdf" | "application/x-httpd-php" | "application/vnd.ms-powerpoint" | "application/vnd.openxmlformats-officedocument.presentationml.presentation" | "application/vnd.rar" | "application/rtf" | "application/x-sh" | "application/x-tar" | "video/mp2t" | "font/ttf" | "text/plain" | "application/vnd.visio" | "audio/wav" | "audio/webm" | "video/webm" | "font/woff" | "font/woff2" | "application/xhtml+xml" | "application/vnd.ms-excel" | "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" | "application/xml" | "application/vnd.mozilla.xul+xml" | "application/zip" | "video/3gpp" | "video/3gpp2" | "application/x-7z-compressed" | null;
705
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<InferMimeTypePipe, never>;
706
- static ɵpipe: _angular_core.ɵɵPipeDeclaration<InferMimeTypePipe, "inferMimeType", true>;
707
- }
921
+ type ControlValueSignalOptions = {
922
+ debounceTime?: number;
923
+ /**
924
+ * @default false
925
+ */
926
+ debounceFirst?: boolean;
927
+ };
928
+ declare const controlValueSignal: <TControlInput extends Signal<AbstractControl | null> | AbstractControl, TControl extends TControlInput extends Signal<infer TSignalControl> ? TSignalControl : TControlInput>(control: TControlInput, options?: ControlValueSignalOptions) => Signal<ReturnType<NonNullable<TControl>["getRawValue"]> | null>;
708
929
  /**
709
- * Infers the mime type of a given url or srcset.
710
- * If a srcset is provided, it will infer the mime type of the first url in the srcset.
711
- * If the srcset contains a query parameter `?fm=`, it will use the value of that parameter, since it is often used to specify the file format in image api's like contentful.
930
+ * The first item in the pair is the previous value and the second item is the current value.
712
931
  */
713
- declare const inferMimeType: (srcset: string) => "image/avif" | "image/bmp" | "image/gif" | "image/vdn.microsoft.icon" | "image/jpeg" | "image/png" | "image/svg+xml" | "image/tiff" | "image/webp" | "audio/aac" | "application/x-abiword" | "application/x-freearc" | "video/x-msvideo" | "application/vnd.amazon.ebook" | "application/octet-stream" | "application/x-bzip" | "application/x-bzip2" | "application/x-cdf" | "application/x-csh" | "text/css" | "text/csv" | "application/msword" | "application/vnd.openxmlformats-officedocument.wordprocessingml.document" | "application/vnd.ms-fontobject" | "application/epub+zip" | "application/gzip" | "text/html" | "text/calendar" | "application/java-archive" | "text/javascript" | "application/json" | "application/ld+json" | "audio/midi" | "audio/mpeg" | "video/mp4" | "video/mpeg" | "tapplication/vnd.apple.installer+xml" | "application/vnd.oasis.opendocument.presentation" | "application/vnd.oasis.opendocument.spreadsheet" | "application/vnd.oasis.opendocument.text" | "audio/ogg" | "video/ogg" | "application/ogg" | "audio/opus" | "font/otf" | "application/pdf" | "application/x-httpd-php" | "application/vnd.ms-powerpoint" | "application/vnd.openxmlformats-officedocument.presentationml.presentation" | "application/vnd.rar" | "application/rtf" | "application/x-sh" | "application/x-tar" | "video/mp2t" | "font/ttf" | "text/plain" | "application/vnd.visio" | "audio/wav" | "audio/webm" | "video/webm" | "font/woff" | "font/woff2" | "application/xhtml+xml" | "application/vnd.ms-excel" | "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" | "application/xml" | "application/vnd.mozilla.xul+xml" | "application/zip" | "video/3gpp" | "video/3gpp2" | "application/x-7z-compressed" | null;
932
+ declare const controlValueSignalWithPrevious: <T extends AbstractControl>(control: T, options?: ControlValueSignalOptions) => Signal<[ReturnType<NonNullable<T extends Signal<infer TSignalControl> ? TSignalControl : T>["getRawValue"]> | null, ReturnType<NonNullable<T extends Signal<infer TSignalControl> ? TSignalControl : T>["getRawValue"]> | null]>;
714
933
 
715
- declare class ToArrayPipe implements PipeTransform {
716
- transform: (value: number) => number[];
717
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ToArrayPipe, never>;
718
- static ɵpipe: _angular_core.ɵɵPipeDeclaration<ToArrayPipe, "toArray", true>;
719
- }
720
- declare const toArray: (value: number) => number[];
721
- declare const toArrayTrackByFn: TrackByFunction<number>;
934
+ declare const signalElementChildren: (el: SignalElementBindingType) => _angular_core.Signal<HTMLElement[]>;
722
935
 
723
- declare const createPropHandlers: () => {
724
- classes: {
725
- remove: (tokens: string) => void;
726
- removeMany: (tokens: string[]) => void;
727
- has: (tokens: string) => boolean;
728
- push: (tokens: string, signal: _angular_core.Signal<unknown>) => void;
729
- pushMany: (map: Record<string, _angular_core.Signal<unknown>>) => void;
730
- };
731
- attributes: {
732
- remove: (tokens: string) => void;
733
- removeMany: (tokens: string[]) => void;
734
- has: (tokens: string) => boolean;
735
- push: (tokens: string, signal: _angular_core.Signal<unknown>) => void;
736
- pushMany: (map: Record<string, _angular_core.Signal<unknown>>) => void;
737
- };
738
- styles: {
739
- remove: (tokens: string) => void;
740
- removeMany: (tokens: string[]) => void;
741
- has: (tokens: string) => boolean;
742
- push: (tokens: string, signal: _angular_core.Signal<unknown>) => void;
743
- pushMany: (map: Record<string, _angular_core.Signal<unknown>>) => void;
744
- };
745
- id: string;
746
- elementRef: ElementRef<HTMLElement>;
936
+ type BuildSignalEffectsConfig<T extends Record<string, Signal<unknown>>> = {
937
+ /** The tokens to apply and their signal value */
938
+ tokenMap: T;
939
+ /** This function will be invoked for elements that were removed from the signal effects */
940
+ cleanupFn: (el: HTMLElement, tokens: string[]) => void;
941
+ /** This function will be invoked for elements that were added to the signal effects or when their signal value changes */
942
+ updateFn: (el: HTMLElement, tokens: string[], conditionResult: unknown) => void;
747
943
  };
748
- type PropHandlers = ReturnType<typeof createPropHandlers>;
749
-
750
- type Props = Readonly<{
751
- attached: Signal<boolean>;
752
- attachedElements: PropsAttachedElements;
753
- }>;
754
- type PropsAttachedElements = {
755
- first: Signal<HTMLElement | null>;
756
- firstId: Signal<string | null>;
757
- get(id: string): HTMLElement | null;
944
+ declare const buildSignalEffects: <T extends Record<string, Signal<unknown>>>(el: SignalElementBindingType, config: BuildSignalEffectsConfig<T>) => {
945
+ remove: (tokens: string) => void;
946
+ removeMany: (tokens: string[]) => void;
947
+ has: (tokens: string) => boolean;
948
+ push: (tokens: string, signal: Signal<unknown>) => void;
949
+ pushMany: (map: Record<string, Signal<unknown>>) => void;
758
950
  };
759
- type PropsAttachedElementsInternal = PropsAttachedElements & {
760
- has: (id: string) => boolean;
761
- push: (id: string, element: HTMLElement) => void;
762
- remove: (id: string) => void;
951
+ declare const signalClasses: <T extends Record<string, Signal<unknown>>>(el: SignalElementBindingType, classMap: T) => {
952
+ remove: (tokens: string) => void;
953
+ removeMany: (tokens: string[]) => void;
954
+ has: (tokens: string) => boolean;
955
+ push: (tokens: string, signal: Signal<unknown>) => void;
956
+ pushMany: (map: Record<string, Signal<unknown>>) => void;
763
957
  };
764
- type PropsInternal = {
765
- single: boolean;
766
- name: string;
767
- bindId: boolean;
768
- attached: Signal<boolean>;
769
- attachedElements: PropsAttachedElementsInternal;
770
- classBindings: Record<string, Signal<unknown>> | null;
771
- attributeBindings: Record<string, Signal<unknown>> | null;
772
- styleBindings: Record<string, Signal<unknown>> | null;
773
- staticClassBindings: string[] | null;
774
- staticAttributeBindings: Record<string, unknown> | null;
775
- staticStyleBindings: Record<string, unknown> | null;
776
- attachEventListeners: ((context: {
777
- on: HTMLElement['addEventListener'];
778
- element: HTMLElement;
779
- }) => void) | null;
958
+ declare const signalHostClasses: <T extends Record<string, Signal<unknown>>>(classMap: T) => {
959
+ remove: (tokens: string) => void;
960
+ removeMany: (tokens: string[]) => void;
961
+ has: (tokens: string) => boolean;
962
+ push: (tokens: string, signal: Signal<unknown>) => void;
963
+ pushMany: (map: Record<string, Signal<unknown>>) => void;
780
964
  };
781
- type CreatePropsOptions = {
782
- name: string;
783
- bindId?: boolean;
784
- single?: boolean;
785
- classes?: Record<string, Signal<unknown>>;
786
- attributes?: Record<string, Signal<unknown>>;
787
- styles?: Record<string, Signal<unknown>>;
788
- staticClasses?: string[];
789
- staticAttributes?: Record<string, unknown>;
790
- staticStyles?: Record<string, unknown>;
791
- listeners?: (context: {
792
- on: HTMLElement['addEventListener'];
793
- element: HTMLElement;
794
- }) => void;
965
+ declare const signalAttributes: <T extends Record<string, Signal<unknown>>>(el: SignalElementBindingType, attributeMap: T) => {
966
+ remove: (tokens: string) => void;
967
+ removeMany: (tokens: string[]) => void;
968
+ has: (tokens: string) => boolean;
969
+ push: (tokens: string, signal: Signal<unknown>) => void;
970
+ pushMany: (map: Record<string, Signal<unknown>>) => void;
795
971
  };
796
- declare const createProps: (props: CreatePropsOptions) => Props;
797
- type HostProps = {
798
- props: Props;
799
- handlers: PropHandlers;
972
+ declare const signalHostAttributes: <T extends Record<string, Signal<unknown>>>(attributeMap: T) => {
973
+ remove: (tokens: string) => void;
974
+ removeMany: (tokens: string[]) => void;
975
+ has: (tokens: string) => boolean;
976
+ push: (tokens: string, signal: Signal<unknown>) => void;
977
+ pushMany: (map: Record<string, Signal<unknown>>) => void;
800
978
  };
801
- declare const createHostProps: (props: CreatePropsOptions) => HostProps;
802
-
803
- declare const createSetup: <T extends Record<string, unknown>>(config: {
804
- setupFn: (params: T) => void;
805
- this: ThisType<unknown>;
806
- }) => (params: T) => void;
807
-
808
- declare const createDependencyStash: <T extends Record<string, WritableSignal<unknown>>>(stash: T) => T & {
809
- provideSignal: <K extends keyof T>(data: {
810
- signal: Signal<ReturnType<T[K]>>;
811
- for: K;
812
- }) => void;
813
- provideValue: <K extends keyof T>(data: {
814
- value: ReturnType<T[K]>;
815
- for: K;
816
- }) => void;
979
+ declare const signalStyles: <T extends Record<string, Signal<unknown>>>(el: SignalElementBindingType, styleMap: T) => {
980
+ remove: (tokens: string) => void;
981
+ removeMany: (tokens: string[]) => void;
982
+ has: (tokens: string) => boolean;
983
+ push: (tokens: string, signal: Signal<unknown>) => void;
984
+ pushMany: (map: Record<string, Signal<unknown>>) => void;
817
985
  };
818
-
819
- declare const createElementDictionary: () => {
820
- ids: _angular_core.Signal<string[]>;
821
- elements: _angular_core.Signal<HTMLElement[]>;
822
- has: (id: string) => boolean;
823
- get: (id: string) => HTMLElement | null;
824
- push: (id: string, element: HTMLElement) => void;
825
- remove: (id: string) => void;
826
- isEmpty: _angular_core.Signal<boolean>;
827
- firstElement: _angular_core.Signal<HTMLElement | null>;
828
- firstId: _angular_core.Signal<string | null>;
986
+ declare const signalHostStyles: <T extends Record<string, Signal<unknown>>>(styleMap: T) => {
987
+ remove: (tokens: string) => void;
988
+ removeMany: (tokens: string[]) => void;
989
+ has: (tokens: string) => boolean;
990
+ push: (tokens: string, signal: Signal<unknown>) => void;
991
+ pushMany: (map: Record<string, Signal<unknown>>) => void;
829
992
  };
830
993
 
831
- type BindPropsOptions = {
832
- props: Props | PropsInternal;
833
- handlers: PropHandlers;
994
+ type LogicalSize = {
995
+ inlineSize: number;
996
+ blockSize: number;
834
997
  };
835
- declare const bindProps: (config: BindPropsOptions) => void;
836
- type UnbindPropsOptions = {
837
- props: Props | PropsInternal;
838
- handlers: PropHandlers;
998
+ type ElementRect = {
999
+ bottom: number;
1000
+ height: number;
1001
+ left: number;
1002
+ right: number;
1003
+ top: number;
1004
+ width: number;
1005
+ x: number;
1006
+ y: number;
839
1007
  };
840
- declare const unbindProps: (config: UnbindPropsOptions) => void;
1008
+ type ElementSize = {
1009
+ width: number;
1010
+ height: number;
1011
+ };
1012
+ declare const boundingClientRectToElementRect: (rect: DOMRectReadOnly) => ElementRect;
1013
+ declare const createElementDimensions: (el: HTMLElement | null, rect?: DOMRect) => NullableElementDimensions;
1014
+ type ElementDimensions = {
1015
+ rect: () => ElementRect;
1016
+ client: ElementSize;
1017
+ scroll: ElementSize;
1018
+ offset: ElementSize;
1019
+ };
1020
+ type NullableElementDimensions = {
1021
+ [K in keyof ElementDimensions]: ElementDimensions[K] | null;
1022
+ };
1023
+ declare const signalElementDimensions: (el: SignalElementBindingType) => Signal<NullableElementDimensions>;
1024
+ declare const signalHostElementDimensions: () => Signal<NullableElementDimensions>;
1025
+ declare const injectViewportSize: () => Signal<ElementSize>;
841
1026
 
842
- declare class PropsDirective {
843
- destroyRef: DestroyRef;
844
- props: _angular_core.InputSignalWithTransform<PropsInternal, Readonly<{
845
- attached: _angular_core.Signal<boolean>;
846
- attachedElements: _ethlete_core.PropsAttachedElements;
847
- }>>;
848
- propHandlers: {
849
- classes: {
850
- remove: (tokens: string) => void;
851
- removeMany: (tokens: string[]) => void;
852
- has: (tokens: string) => boolean;
853
- push: (tokens: string, signal: _angular_core.Signal<unknown>) => void;
854
- pushMany: (map: Record<string, _angular_core.Signal<unknown>>) => void;
855
- };
856
- attributes: {
857
- remove: (tokens: string) => void;
858
- removeMany: (tokens: string[]) => void;
859
- has: (tokens: string) => boolean;
860
- push: (tokens: string, signal: _angular_core.Signal<unknown>) => void;
861
- pushMany: (map: Record<string, _angular_core.Signal<unknown>>) => void;
862
- };
863
- styles: {
864
- remove: (tokens: string) => void;
865
- removeMany: (tokens: string[]) => void;
866
- has: (tokens: string) => boolean;
867
- push: (tokens: string, signal: _angular_core.Signal<unknown>) => void;
868
- pushMany: (map: Record<string, _angular_core.Signal<unknown>>) => void;
869
- };
870
- id: string;
871
- elementRef: _angular_core.ElementRef<HTMLElement>;
872
- };
873
- constructor();
874
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<PropsDirective, never>;
875
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PropsDirective, "[etProps]", never, { "props": { "alias": "etProps"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
876
- }
877
-
878
- type AnyTemplateType = string | TemplateRef<unknown> | ComponentType<unknown> | TemplateRefWithContext | ComponentTypeWithInputs;
879
- type TemplateRefWithContext<T = Record<string, unknown> | undefined, J = unknown> = {
880
- template: TemplateRef<J>;
881
- context?: T;
882
- injector?: Injector;
1027
+ type SignalElementIntersectionOptions = Omit<IntersectionObserverInit, 'root'> & {
1028
+ root?: SignalElementBindingType;
1029
+ enabled?: Signal<boolean>;
883
1030
  };
884
- type ComponentTypeWithInputs<T = Record<string, unknown> | undefined, J = unknown> = {
885
- component: ComponentType<J>;
886
- inputs?: T;
887
- injector?: Injector;
1031
+ type IntersectionObserverEntryWithDetails = IntersectionObserverEntry & {
1032
+ isAbove: boolean;
1033
+ isBelow: boolean;
1034
+ isLeft: boolean;
1035
+ isRight: boolean;
1036
+ isVisible: boolean;
888
1037
  };
889
- type StringTemplate = {
890
- type: 'string';
891
- value: string;
1038
+ declare const signalElementIntersection: (el: SignalElementBindingType, options?: SignalElementIntersectionOptions) => Signal<IntersectionObserverEntryWithDetails[]>;
1039
+ declare const signalHostElementIntersection: (options?: SignalElementIntersectionOptions) => Signal<IntersectionObserverEntryWithDetails[]>;
1040
+
1041
+ declare const signalElementMutations: (el: SignalElementBindingType, options?: MutationObserverInit) => _angular_core.Signal<MutationRecord | null>;
1042
+ declare const signalHostElementMutations: (options?: MutationObserverInit) => _angular_core.Signal<MutationRecord | null>;
1043
+
1044
+ type ElementLastScrollDirectionType = 'up' | 'down' | 'left' | 'right';
1045
+ type ElementLastScrollDirection = {
1046
+ type: ElementLastScrollDirectionType;
1047
+ time: number;
892
1048
  };
893
- type NgTemplateTemplate = {
894
- type: 'template';
895
- value: TemplateRef<unknown>;
896
- context?: Record<string, unknown>;
897
- injector: Injector | null;
1049
+ declare const signalElementLastScrollDirection: (el: SignalElementBindingType) => _angular_core.Signal<ElementLastScrollDirection | null>;
1050
+ declare const signalHostElementLastScrollDirection: () => _angular_core.Signal<ElementLastScrollDirection | null>;
1051
+
1052
+ type SignalElementScrollStateOptions = {
1053
+ /** The initial scroll position to scroll to. Once a truthy value get's emitted, all further values will be ignored. */
1054
+ initialScrollPosition?: Signal<ScrollToOptions | null>;
898
1055
  };
899
- type ComponentTemplate = {
900
- type: 'component';
901
- value: ComponentType<unknown>;
902
- inputs?: Record<string, unknown>;
903
- injector: Injector | null;
1056
+ type ElementScrollState = {
1057
+ canScroll: boolean;
1058
+ canScrollHorizontally: boolean;
1059
+ canScrollVertically: boolean;
1060
+ elementDimensions: NullableElementDimensions;
904
1061
  };
905
- declare const templateComputed: (templateSignal: Signal<AnyTemplateType | null>) => Signal<StringTemplate | NgTemplateTemplate | ComponentTemplate | null>;
1062
+ declare const areScrollStatesEqual: (a: ElementScrollState, b: ElementScrollState) => boolean;
1063
+ declare const signalElementScrollState: (el: SignalElementBindingType, options?: SignalElementScrollStateOptions) => Signal<ElementScrollState>;
1064
+ declare const signalHostElementScrollState: () => Signal<ElementScrollState>;
906
1065
 
907
1066
  declare const injectAngularRootElement: {
908
1067
  (): _angular_core.WritableSignal<HTMLElement | null>;
@@ -934,65 +1093,6 @@ declare const BOUNDARY_ELEMENT_TOKEN: _angular_core.InjectionToken<{
934
1093
  override: _angular_core.WritableSignal<HTMLElement | null>;
935
1094
  }>;
936
1095
 
937
- type Vec2 = [number, number];
938
- type ViewportConfig = {
939
- breakpoints: {
940
- xs: Vec2;
941
- sm: Vec2;
942
- md: Vec2;
943
- lg: Vec2;
944
- xl: Vec2;
945
- '2xl': Vec2;
946
- };
947
- };
948
- type Breakpoint = keyof ViewportConfig['breakpoints'];
949
- /**
950
- * Default viewport config based on Tailwind CSS.
951
- * @see https://tailwindcss.com/docs/screens
952
- */
953
- declare const DEFAULT_VIEWPORT_CONFIG: ViewportConfig;
954
- declare const provideViewportConfig: (valueOverride?: Partial<ViewportConfig> | undefined) => _angular_core.Provider[];
955
- declare const injectViewportConfig: {
956
- (): ViewportConfig;
957
- (options: _angular_core.InjectOptions & {
958
- optional?: false;
959
- }): ViewportConfig;
960
- (options: _angular_core.InjectOptions): ViewportConfig | null;
961
- };
962
- type BuildMediaQueryOptions = {
963
- min?: number | Breakpoint;
964
- max?: number | Breakpoint;
965
- };
966
- declare const provideBreakpointObserver: () => _angular_core.Provider[];
967
- declare const injectBreakpointObserver: {
968
- (): {
969
- observeBreakpoint: (options: BuildMediaQueryOptions) => _angular_core.Signal<boolean>;
970
- isBreakpointMatched: (options: BuildMediaQueryOptions) => boolean;
971
- getBreakpointSize: (type: Breakpoint, option: "min" | "max") => number;
972
- buildMediaQueryString: (options: BuildMediaQueryOptions) => string;
973
- observeMediaQuery: (mediaQuery: string) => _angular_core.Signal<boolean>;
974
- isMediaQueryMatched: (mediaQuery: string) => boolean;
975
- };
976
- (options: _angular_core.InjectOptions & {
977
- optional?: false;
978
- }): {
979
- observeBreakpoint: (options: BuildMediaQueryOptions) => _angular_core.Signal<boolean>;
980
- isBreakpointMatched: (options: BuildMediaQueryOptions) => boolean;
981
- getBreakpointSize: (type: Breakpoint, option: "min" | "max") => number;
982
- buildMediaQueryString: (options: BuildMediaQueryOptions) => string;
983
- observeMediaQuery: (mediaQuery: string) => _angular_core.Signal<boolean>;
984
- isMediaQueryMatched: (mediaQuery: string) => boolean;
985
- };
986
- (options: _angular_core.InjectOptions): {
987
- observeBreakpoint: (options: BuildMediaQueryOptions) => _angular_core.Signal<boolean>;
988
- isBreakpointMatched: (options: BuildMediaQueryOptions) => boolean;
989
- getBreakpointSize: (type: Breakpoint, option: "min" | "max") => number;
990
- buildMediaQueryString: (options: BuildMediaQueryOptions) => string;
991
- observeMediaQuery: (mediaQuery: string) => _angular_core.Signal<boolean>;
992
- isMediaQueryMatched: (mediaQuery: string) => boolean;
993
- } | null;
994
- };
995
-
996
1096
  declare const provideFocusVisibleTracker: () => _angular_core.Provider[];
997
1097
  declare const injectFocusVisibleTracker: {
998
1098
  (): {
@@ -1059,6 +1159,11 @@ declare const injectRenderer: {
1059
1159
  setDataAttributes: (element: HTMLElement, data: Record<string, string | null>) => void;
1060
1160
  setCssProperty: (element: HTMLElement, name: string, value: string | null) => void;
1061
1161
  setCssProperties: (element: HTMLElement, properties: Record<string, string | null>) => void;
1162
+ moveBefore: (config: {
1163
+ newParent: HTMLElement;
1164
+ child: HTMLElement;
1165
+ before?: Node | null;
1166
+ }) => void;
1062
1167
  renderer: _angular_core.Renderer2;
1063
1168
  };
1064
1169
  (options: _angular_core.InjectOptions & {
@@ -1094,6 +1199,11 @@ declare const injectRenderer: {
1094
1199
  setDataAttributes: (element: HTMLElement, data: Record<string, string | null>) => void;
1095
1200
  setCssProperty: (element: HTMLElement, name: string, value: string | null) => void;
1096
1201
  setCssProperties: (element: HTMLElement, properties: Record<string, string | null>) => void;
1202
+ moveBefore: (config: {
1203
+ newParent: HTMLElement;
1204
+ child: HTMLElement;
1205
+ before?: Node | null;
1206
+ }) => void;
1097
1207
  renderer: _angular_core.Renderer2;
1098
1208
  };
1099
1209
  (options: _angular_core.InjectOptions): {
@@ -1127,303 +1237,91 @@ declare const injectRenderer: {
1127
1237
  setDataAttributes: (element: HTMLElement, data: Record<string, string | null>) => void;
1128
1238
  setCssProperty: (element: HTMLElement, name: string, value: string | null) => void;
1129
1239
  setCssProperties: (element: HTMLElement, properties: Record<string, string | null>) => void;
1240
+ moveBefore: (config: {
1241
+ newParent: HTMLElement;
1242
+ child: HTMLElement;
1243
+ before?: Node | null;
1244
+ }) => void;
1130
1245
  renderer: _angular_core.Renderer2;
1131
1246
  } | null;
1132
1247
  };
1133
1248
  type AngularRenderer = NonNullable<ReturnType<typeof injectRenderer>>;
1134
1249
 
1135
- declare const previousSignalValue: <T>(signal: Signal<T>) => Signal<T | undefined>;
1136
- type SyncSignalOptions = {
1250
+ type StyleManager = {
1251
+ mount: <TComponent>(component: Type<TComponent>) => ComponentRef<TComponent>;
1252
+ };
1253
+ declare const provideStyleManager: () => _angular_core.Provider[];
1254
+ declare const injectStyleManager: {
1255
+ (): StyleManager;
1256
+ (options: _angular_core.InjectOptions & {
1257
+ optional?: false;
1258
+ }): StyleManager;
1259
+ (options: _angular_core.InjectOptions): StyleManager | null;
1260
+ };
1261
+
1262
+ interface ConsentHandler {
1263
+ /** Signal that is `true` when consent has been granted. */
1264
+ isGranted: Signal<boolean>;
1265
+ /** Grants consent and writes the decision back to the source. */
1266
+ grant: () => void;
1267
+ /** Revokes consent and writes the decision back to the source. */
1268
+ revoke?: () => void;
1269
+ }
1270
+ type CreateUserConsentProviderOptions = {
1271
+ /** The provider result returned by `createStaticProvider` that this consent provider should be associated with. */
1272
+ for: InjectionToken<ConsentHandler | null>;
1137
1273
  /**
1138
- * If true, the target signal will not be updated with the source signal's value in a sync operation.
1139
- * This should be set to true for signals that need to be initialized first before syncing (eg. required inputs)
1140
- * @default false
1274
+ * Factory executed inside the injection context that returns a `Signal<boolean>`.
1275
+ *
1276
+ * @example
1277
+ * isGranted: () => inject(CookieService).hasMediaConsent
1141
1278
  */
1142
- skipSyncRead?: boolean;
1279
+ isGranted: () => Signal<boolean>;
1143
1280
  /**
1144
- * If true, the first time the effect will be triggered will be skipped.
1145
- * @default false
1281
+ * Factory executed inside the injection context that returns the grant function.
1282
+ *
1283
+ * @example
1284
+ * grant: () => () => inject(CookieService).acceptAll()
1146
1285
  */
1147
- skipFirstRun?: boolean;
1286
+ grant: () => () => void;
1287
+ /**
1288
+ * Factory executed inside the injection context that returns the revoke function.
1289
+ *
1290
+ * @example
1291
+ * revoke : () => () => inject(CookieService).revokeAll()
1292
+ */
1293
+ revoke?: () => () => void;
1148
1294
  };
1149
- declare const syncSignal: <T>(from: Signal<T>, to: WritableSignal<T>, options?: SyncSignalOptions) => _angular_core.EffectRef;
1150
- type MaybeSignal<T> = T | Signal<T>;
1151
- declare const maybeSignalValue: <T>(value: MaybeSignal<T>) => T;
1295
+ declare const createUserConsentProvider: (options: CreateUserConsentProviderOptions) => Provider;
1296
+
1297
+ /** Inject a signal containing a boolean value indicating if the viewport is xs */
1298
+ declare const injectIsXs: () => _angular_core.Signal<boolean>;
1299
+ /** Inject a signal containing a boolean value indicating if the viewport is sm */
1300
+ declare const injectIsSm: () => _angular_core.Signal<boolean>;
1301
+ /** Inject a signal containing a boolean value indicating if the viewport is md */
1302
+ declare const injectIsMd: () => _angular_core.Signal<boolean>;
1303
+ /** Inject a signal containing a boolean value indicating if the viewport is lg */
1304
+ declare const injectIsLg: () => _angular_core.Signal<boolean>;
1305
+ /** Inject a signal containing a boolean value indicating if the viewport is xl */
1306
+ declare const injectIsXl: () => _angular_core.Signal<boolean>;
1307
+ /** Inject a signal containing a boolean value indicating if the viewport is 2xl */
1308
+ declare const injectIs2Xl: () => _angular_core.Signal<boolean>;
1152
1309
  /**
1153
- * A computed that will only be reactive until the source signal contains a truthy value.
1154
- * All subsequent changes inside the computation will be ignored.
1310
+ * Inject a boolean value indicating if the viewport is matching the provided options.
1311
+ * This value is not reactive. If you want to react to changes, use the {@link injectObserveBreakpoint} function instead.
1155
1312
  */
1156
- declare const computedTillTruthy: <T>(source: Signal<T>) => Signal<T | null>;
1313
+ declare const injectBreakpointIsMatched: (options: BuildMediaQueryOptions) => boolean;
1157
1314
  /**
1158
- * A computed that will only be reactive until the source signal contains a falsy value.
1159
- * All subsequent changes inside the computation will be ignored.
1315
+ * Inject a boolean value indicating if the media query is matched.
1316
+ * This value is not reactive. If you want to react to changes, use the {@link injectObserveMediaQuery} function instead.
1160
1317
  */
1161
- declare const computedTillFalsy: <T>(source: Signal<T>) => Signal<T | null>;
1318
+ declare const injectMediaQueryIsMatched: (mediaQuery: string) => boolean;
1162
1319
  /**
1163
- * A writeable signal that will be set to the provided value once all inputs are set.
1164
- * During that time, the signal will be set to `null`.
1320
+ * Inject a signal containing a boolean value indicating if the viewport is matching the provided options.
1165
1321
  */
1166
- declare const deferredSignal: <T extends () => unknown>(valueFn: T) => WritableSignal<ReturnType<T> | null>;
1167
- declare const memoizeSignal: <T>(factory: () => Signal<T>) => () => Signal<T>;
1168
-
1169
- type SignalAnimatedNumberOptions = {
1170
- /**
1171
- * The initial value to start animating from.
1172
- * If not provided, the animation will start from 0
1173
- */
1174
- initialValue?: number;
1175
- /**
1176
- * Duration of the animation in milliseconds.
1177
- * @default 1000
1178
- */
1179
- duration?: number;
1180
- /**
1181
- * Easing function that takes a progress value (0 to 1) and returns an eased value (0 to 1).
1182
- * Options:
1183
- * - `easeLinear()`
1184
- * - `easeIn()`
1185
- * - `easeOut()`
1186
- * - `easeInOut()`
1187
- * - `easeElastic()`
1188
- * - `easeOutBack()`
1189
- * - `easeOutBackStrong()`
1190
- * @default easeOut()
1191
- */
1192
- easing?: (t: number) => number;
1193
- /**
1194
- * Function to round the animated value.
1195
- * @default (v: number) => Math.round(v)
1196
- */
1197
- round?: (value: number) => number;
1198
- /**
1199
- * Callback invoked when the animation starts.
1200
- */
1201
- onAnimationStart?: () => void;
1202
- /**
1203
- * Callback invoked when the animation ends.
1204
- */
1205
- onAnimationEnd?: () => void;
1206
- };
1207
- type AnimatedNumberSignal = Signal<number> & {
1208
- /**
1209
- * Starts the animation from the current value to the target value.
1210
- * @returns The animated signal for chaining
1211
- */
1212
- play: () => AnimatedNumberSignal;
1213
- /**
1214
- * Resets the animation to the initial value and stops any ongoing animation.
1215
- * @returns The animated signal for chaining
1216
- */
1217
- reset: () => AnimatedNumberSignal;
1218
- /**
1219
- * Stops the current animation at its current position.
1220
- * @returns The animated signal for chaining
1221
- */
1222
- stop: () => AnimatedNumberSignal;
1223
- };
1322
+ declare const injectObserveBreakpoint: (options: BuildMediaQueryOptions) => _angular_core.Signal<boolean>;
1224
1323
  /**
1225
- * Creates a signal that animates the transition of a numeric signal's value over time.
1226
- */
1227
- declare const signalAnimatedNumber: (source: MaybeSignal<number>, options?: SignalAnimatedNumberOptions) => AnimatedNumberSignal;
1228
- declare const easeLinear: (t: number) => number;
1229
- declare const easeIn: (t: number) => number;
1230
- declare const easeOut: (t: number) => number;
1231
- declare const easeInOut: (t: number) => number;
1232
- /** Elastic easing function (overshoots) */
1233
- declare const easeElastic: (t: number) => number;
1234
- /** Back easing function (overshoots slightly then settles) */
1235
- declare const easeOutBack: (t: number) => number;
1236
- /** Back easing function with more overshoot */
1237
- declare const easeOutBackStrong: (t: number) => number;
1238
-
1239
- type ControlValueSignalOptions = {
1240
- debounceTime?: number;
1241
- /**
1242
- * @default false
1243
- */
1244
- debounceFirst?: boolean;
1245
- };
1246
- declare const controlValueSignal: <TControlInput extends Signal<AbstractControl | null> | AbstractControl, TControl extends TControlInput extends Signal<infer TSignalControl> ? TSignalControl : TControlInput>(control: TControlInput, options?: ControlValueSignalOptions) => Signal<ReturnType<NonNullable<TControl>["getRawValue"]> | null>;
1247
- /**
1248
- * The first item in the pair is the previous value and the second item is the current value.
1249
- */
1250
- declare const controlValueSignalWithPrevious: <T extends AbstractControl>(control: T, options?: ControlValueSignalOptions) => Signal<[ReturnType<NonNullable<T extends Signal<infer TSignalControl> ? TSignalControl : T>["getRawValue"]> | null, ReturnType<NonNullable<T extends Signal<infer TSignalControl> ? TSignalControl : T>["getRawValue"]> | null]>;
1251
-
1252
- type SignalElementBindingComplexType = HTMLElement | ElementRef<HTMLElement> | QueryList<ElementRef<HTMLElement> | HTMLElement> | Array<ElementRef<HTMLElement> | HTMLElement> | null | undefined;
1253
- type SignalElementBindingType = HTMLElement | ElementRef<HTMLElement> | Observable<SignalElementBindingComplexType> | Signal<SignalElementBindingComplexType> | QueryList<ElementRef<HTMLElement> | HTMLElement> | ElementSignal;
1254
- type ElementSignal = Signal<{
1255
- currentElements: HTMLElement[];
1256
- previousElements: HTMLElement[];
1257
- }>;
1258
- type ElementSignalValue = ReturnType<ElementSignal>;
1259
- declare const isElementSignal: (el: unknown) => el is ElementSignal;
1260
- declare const createDocumentElementSignal: () => ElementSignal;
1261
- declare const createEmptyElementSignal: () => ElementSignal;
1262
- declare const buildElementSignal: (el: SignalElementBindingType | null | undefined) => ElementSignal;
1263
- declare const firstElementSignal: (el: ElementSignal) => Signal<{
1264
- currentElement: HTMLElement | null;
1265
- previousElement: HTMLElement | null;
1266
- }>;
1267
-
1268
- declare const signalElementChildren: (el: SignalElementBindingType) => _angular_core.Signal<HTMLElement[]>;
1269
-
1270
- type BuildSignalEffectsConfig<T extends Record<string, Signal<unknown>>> = {
1271
- /** The tokens to apply and their signal value */
1272
- tokenMap: T;
1273
- /** This function will be invoked for elements that were removed from the signal effects */
1274
- cleanupFn: (el: HTMLElement, tokens: string[]) => void;
1275
- /** This function will be invoked for elements that were added to the signal effects or when their signal value changes */
1276
- updateFn: (el: HTMLElement, tokens: string[], conditionResult: unknown) => void;
1277
- };
1278
- declare const buildSignalEffects: <T extends Record<string, Signal<unknown>>>(el: SignalElementBindingType, config: BuildSignalEffectsConfig<T>) => {
1279
- remove: (tokens: string) => void;
1280
- removeMany: (tokens: string[]) => void;
1281
- has: (tokens: string) => boolean;
1282
- push: (tokens: string, signal: Signal<unknown>) => void;
1283
- pushMany: (map: Record<string, Signal<unknown>>) => void;
1284
- };
1285
- declare const signalClasses: <T extends Record<string, Signal<unknown>>>(el: SignalElementBindingType, classMap: T) => {
1286
- remove: (tokens: string) => void;
1287
- removeMany: (tokens: string[]) => void;
1288
- has: (tokens: string) => boolean;
1289
- push: (tokens: string, signal: Signal<unknown>) => void;
1290
- pushMany: (map: Record<string, Signal<unknown>>) => void;
1291
- };
1292
- declare const signalHostClasses: <T extends Record<string, Signal<unknown>>>(classMap: T) => {
1293
- remove: (tokens: string) => void;
1294
- removeMany: (tokens: string[]) => void;
1295
- has: (tokens: string) => boolean;
1296
- push: (tokens: string, signal: Signal<unknown>) => void;
1297
- pushMany: (map: Record<string, Signal<unknown>>) => void;
1298
- };
1299
- declare const signalAttributes: <T extends Record<string, Signal<unknown>>>(el: SignalElementBindingType, attributeMap: T) => {
1300
- remove: (tokens: string) => void;
1301
- removeMany: (tokens: string[]) => void;
1302
- has: (tokens: string) => boolean;
1303
- push: (tokens: string, signal: Signal<unknown>) => void;
1304
- pushMany: (map: Record<string, Signal<unknown>>) => void;
1305
- };
1306
- declare const signalHostAttributes: <T extends Record<string, Signal<unknown>>>(attributeMap: T) => {
1307
- remove: (tokens: string) => void;
1308
- removeMany: (tokens: string[]) => void;
1309
- has: (tokens: string) => boolean;
1310
- push: (tokens: string, signal: Signal<unknown>) => void;
1311
- pushMany: (map: Record<string, Signal<unknown>>) => void;
1312
- };
1313
- declare const signalStyles: <T extends Record<string, Signal<unknown>>>(el: SignalElementBindingType, styleMap: T) => {
1314
- remove: (tokens: string) => void;
1315
- removeMany: (tokens: string[]) => void;
1316
- has: (tokens: string) => boolean;
1317
- push: (tokens: string, signal: Signal<unknown>) => void;
1318
- pushMany: (map: Record<string, Signal<unknown>>) => void;
1319
- };
1320
- declare const signalHostStyles: <T extends Record<string, Signal<unknown>>>(styleMap: T) => {
1321
- remove: (tokens: string) => void;
1322
- removeMany: (tokens: string[]) => void;
1323
- has: (tokens: string) => boolean;
1324
- push: (tokens: string, signal: Signal<unknown>) => void;
1325
- pushMany: (map: Record<string, Signal<unknown>>) => void;
1326
- };
1327
-
1328
- type LogicalSize = {
1329
- inlineSize: number;
1330
- blockSize: number;
1331
- };
1332
- type ElementRect = {
1333
- bottom: number;
1334
- height: number;
1335
- left: number;
1336
- right: number;
1337
- top: number;
1338
- width: number;
1339
- x: number;
1340
- y: number;
1341
- };
1342
- type ElementSize = {
1343
- width: number;
1344
- height: number;
1345
- };
1346
- declare const boundingClientRectToElementRect: (rect: DOMRectReadOnly) => ElementRect;
1347
- declare const createElementDimensions: (el: HTMLElement | null, rect?: DOMRect) => NullableElementDimensions;
1348
- type ElementDimensions = {
1349
- rect: () => ElementRect;
1350
- client: ElementSize;
1351
- scroll: ElementSize;
1352
- offset: ElementSize;
1353
- };
1354
- type NullableElementDimensions = {
1355
- [K in keyof ElementDimensions]: ElementDimensions[K] | null;
1356
- };
1357
- declare const signalElementDimensions: (el: SignalElementBindingType) => _angular_core.Signal<NullableElementDimensions>;
1358
- declare const signalHostElementDimensions: () => _angular_core.Signal<NullableElementDimensions>;
1359
-
1360
- type SignalElementIntersectionOptions = Omit<IntersectionObserverInit, 'root'> & {
1361
- root?: SignalElementBindingType;
1362
- enabled?: Signal<boolean>;
1363
- };
1364
- type IntersectionObserverEntryWithDetails = IntersectionObserverEntry & {
1365
- isAbove: boolean;
1366
- isBelow: boolean;
1367
- isLeft: boolean;
1368
- isRight: boolean;
1369
- isVisible: boolean;
1370
- };
1371
- declare const signalElementIntersection: (el: SignalElementBindingType, options?: SignalElementIntersectionOptions) => Signal<IntersectionObserverEntryWithDetails[]>;
1372
- declare const signalHostElementIntersection: (options?: SignalElementIntersectionOptions) => Signal<IntersectionObserverEntryWithDetails[]>;
1373
-
1374
- declare const signalElementMutations: (el: SignalElementBindingType, options?: MutationObserverInit) => _angular_core.Signal<MutationRecord | null>;
1375
- declare const signalHostElementMutations: (options?: MutationObserverInit) => _angular_core.Signal<MutationRecord | null>;
1376
-
1377
- type ElementLastScrollDirectionType = 'up' | 'down' | 'left' | 'right';
1378
- type ElementLastScrollDirection = {
1379
- type: ElementLastScrollDirectionType;
1380
- time: number;
1381
- };
1382
- declare const signalElementLastScrollDirection: (el: SignalElementBindingType) => _angular_core.Signal<ElementLastScrollDirection | null>;
1383
- declare const signalHostElementLastScrollDirection: () => _angular_core.Signal<ElementLastScrollDirection | null>;
1384
-
1385
- type SignalElementScrollStateOptions = {
1386
- /** The initial scroll position to scroll to. Once a truthy value get's emitted, all further values will be ignored. */
1387
- initialScrollPosition?: Signal<ScrollToOptions | null>;
1388
- };
1389
- type ElementScrollState = {
1390
- canScroll: boolean;
1391
- canScrollHorizontally: boolean;
1392
- canScrollVertically: boolean;
1393
- elementDimensions: NullableElementDimensions;
1394
- };
1395
- declare const areScrollStatesEqual: (a: ElementScrollState, b: ElementScrollState) => boolean;
1396
- declare const signalElementScrollState: (el: SignalElementBindingType, options?: SignalElementScrollStateOptions) => Signal<ElementScrollState>;
1397
- declare const signalHostElementScrollState: () => Signal<ElementScrollState>;
1398
-
1399
- /** Inject a signal containing a boolean value indicating if the viewport is xs */
1400
- declare const injectIsXs: () => _angular_core.Signal<boolean>;
1401
- /** Inject a signal containing a boolean value indicating if the viewport is sm */
1402
- declare const injectIsSm: () => _angular_core.Signal<boolean>;
1403
- /** Inject a signal containing a boolean value indicating if the viewport is md */
1404
- declare const injectIsMd: () => _angular_core.Signal<boolean>;
1405
- /** Inject a signal containing a boolean value indicating if the viewport is lg */
1406
- declare const injectIsLg: () => _angular_core.Signal<boolean>;
1407
- /** Inject a signal containing a boolean value indicating if the viewport is xl */
1408
- declare const injectIsXl: () => _angular_core.Signal<boolean>;
1409
- /** Inject a signal containing a boolean value indicating if the viewport is 2xl */
1410
- declare const injectIs2Xl: () => _angular_core.Signal<boolean>;
1411
- /**
1412
- * Inject a boolean value indicating if the viewport is matching the provided options.
1413
- * This value is not reactive. If you want to react to changes, use the {@link injectObserveBreakpoint} function instead.
1414
- */
1415
- declare const injectBreakpointIsMatched: (options: BuildMediaQueryOptions) => boolean;
1416
- /**
1417
- * Inject a boolean value indicating if the media query is matched.
1418
- * This value is not reactive. If you want to react to changes, use the {@link injectObserveMediaQuery} function instead.
1419
- */
1420
- declare const injectMediaQueryIsMatched: (mediaQuery: string) => boolean;
1421
- /**
1422
- * Inject a signal containing a boolean value indicating if the viewport is matching the provided options.
1423
- */
1424
- declare const injectObserveBreakpoint: (options: BuildMediaQueryOptions) => _angular_core.Signal<boolean>;
1425
- /**
1426
- * Inject a signal containing a boolean value indicating if the media query is matched.
1324
+ * Inject a signal containing a boolean value indicating if the media query is matched.
1427
1325
  */
1428
1326
  declare const injectObserveMediaQuery: (mediaQuery: string) => _angular_core.Signal<boolean>;
1429
1327
  /** Inject a signal containing the current breakpoint. */
@@ -1440,6 +1338,8 @@ declare const injectHasTouchInput: () => _angular_core.Signal<boolean>;
1440
1338
  declare const injectHasPrecisionInput: () => _angular_core.Signal<boolean>;
1441
1339
  /** Inject a signal containing the current device input type */
1442
1340
  declare const injectDeviceInputType: () => _angular_core.Signal<"touch" | "mouse">;
1341
+ /** Inject a signal that indicates if the user prefers reduced motion */
1342
+ declare const injectPrefersReducedMotion: () => _angular_core.Signal<boolean>;
1443
1343
  /** Inject a signal containing a boolean value indicating if the user can hover (eg. using a mouse) */
1444
1344
  declare const injectCanHover: () => _angular_core.Signal<boolean>;
1445
1345
  /** Inject a signal containing the viewport dimensions */
@@ -1470,152 +1370,1108 @@ type CursorDragScrollOptions = {
1470
1370
  /** The allowed scroll direction. */
1471
1371
  allowedDirection?: MaybeSignal<CursorDragScrollDirection>;
1472
1372
  };
1473
- /** A function to apply cursor drag scroll behavior to an element. */
1474
- declare const useCursorDragScroll: (el: SignalElementBindingType, options?: CursorDragScrollOptions) => {
1475
- isDragging: Signal<boolean>;
1476
- currentDragAmount: Signal<{
1477
- x: number;
1478
- y: number;
1479
- }>;
1373
+ /** A function to apply cursor drag scroll behavior to an element. */
1374
+ declare const useCursorDragScroll: (el: SignalElementBindingType, options?: CursorDragScrollOptions) => {
1375
+ isDragging: Signal<boolean>;
1376
+ currentDragAmount: Signal<{
1377
+ x: number;
1378
+ y: number;
1379
+ }>;
1380
+ };
1381
+
1382
+ type SetupScrollRestorationConfig = {
1383
+ /**
1384
+ * The scrollable container.
1385
+ * @default document.documentElement
1386
+ */
1387
+ scrollElement?: HTMLElement;
1388
+ /**
1389
+ * A list of query params that should trigger a scroll to top.
1390
+ * @default []
1391
+ * @example ['page'] // will scroll to top when the page query param changes
1392
+ */
1393
+ queryParamTriggerList?: string[];
1394
+ /**
1395
+ * Config for fragment scrolling.
1396
+ */
1397
+ fragment?: {
1398
+ /**
1399
+ * Enable fragment scrolling (scroll to element with id)
1400
+ * @default false
1401
+ */
1402
+ enabled?: boolean;
1403
+ /**
1404
+ * Whether to use smooth scrolling or not.
1405
+ * @default false
1406
+ */
1407
+ smooth?: boolean;
1408
+ };
1409
+ };
1410
+ declare const ET_DISABLE_SCROLL_TOP: unique symbol;
1411
+ declare const ET_DISABLE_SCROLL_TOP_AS_RETURN_ROUTE: unique symbol;
1412
+ declare const ET_DISABLE_SCROLL_TOP_ON_PATH_PARAM_CHANGE: unique symbol;
1413
+ type RouterDisableScrollTopConfig = {
1414
+ /**
1415
+ * Whether to disable scroll to top ONLY when navigating back to this route.
1416
+ * @default false
1417
+ */
1418
+ asReturnRoute?: boolean;
1419
+ /**
1420
+ * Whether to disable scroll to top when a path param changes.
1421
+ * @default false
1422
+ */
1423
+ onPathParamChange?: boolean;
1424
+ };
1425
+ declare const routerDisableScrollTop: (config?: RouterDisableScrollTopConfig) => {
1426
+ [ET_DISABLE_SCROLL_TOP_ON_PATH_PARAM_CHANGE]?: boolean | undefined;
1427
+ [ET_DISABLE_SCROLL_TOP]: boolean;
1428
+ } | {
1429
+ [ET_DISABLE_SCROLL_TOP_ON_PATH_PARAM_CHANGE]?: boolean | undefined;
1430
+ [ET_DISABLE_SCROLL_TOP_AS_RETURN_ROUTE]: boolean;
1431
+ };
1432
+ declare const setupScrollRestoration: (config?: SetupScrollRestorationConfig) => void;
1433
+
1434
+ declare const signalIsRendered: () => _angular_core.Signal<boolean>;
1435
+ declare const createIsRenderedSignal: () => {
1436
+ state: _angular_core.WritableSignal<boolean>;
1437
+ bind: () => _angular_core.EffectRef;
1438
+ };
1439
+ declare const createCanAnimateSignal: () => {
1440
+ state: _angular_core.Signal<boolean>;
1441
+ };
1442
+
1443
+ type RouterState = {
1444
+ data: Data;
1445
+ pathParams: Params;
1446
+ queryParams: Params;
1447
+ title: string | null;
1448
+ fragment: string | null;
1449
+ };
1450
+ declare const ET_PROPERTY_REMOVED: unique symbol;
1451
+ type InjectUtilConfig = {
1452
+ /** The injector to use for the injection. Must be provided if the function is not called from within a injection context. */
1453
+ injector?: Injector;
1454
+ };
1455
+ type InjectUtilTransformConfig<In, Out> = {
1456
+ /**
1457
+ * A transform function similar to the `transform` function in Angular input bindings.
1458
+ * Can be used to transform the value before it is returned.
1459
+ * E.g. transforming `"true"` to `true` for a boolean attribute.
1460
+ */
1461
+ transform?: (value: In) => Out;
1462
+ };
1463
+ declare const transformOrReturn: <In, Out>(src: Signal<In>, config?: InjectUtilTransformConfig<In, Out>) => Signal<Out>;
1464
+ /** Inject the current router event */
1465
+ declare const injectRouterEvent: () => Signal<_angular_router.Event>;
1466
+ /**
1467
+ * Signal that indicates whether the router has been initialized.
1468
+ * The router is considered initialized once the first NavigationEnd event with an id different than -1 has been emitted.
1469
+ */
1470
+ declare const injectIsRouterInitialized: () => Signal<boolean>;
1471
+ /**
1472
+ * Inject the current url.
1473
+ * The url includes query params as well as the fragment. Use `injectRoute` instead if you are not intrusted in those.
1474
+ * @example "/my-page?query=1&param=true#fragment"
1475
+ */
1476
+ declare const injectUrl: () => Signal<string>;
1477
+ /**
1478
+ * Inject the current route
1479
+ * @example "/my-page"
1480
+ */
1481
+ declare const injectRoute: () => Signal<string>;
1482
+ declare const createRouterState: (router: Router) => RouterState;
1483
+ /**
1484
+ * Read the current route (the committed url without query params and fragment) straight from the router.
1485
+ * Unlike the `injectRoute` signal this reads synchronously, so it can be used inside a `router.events` handler
1486
+ * where `router.url` is already committed. Falls back to the browser location before the first navigation commits.
1487
+ */
1488
+ declare const createRoute: (router: Router) => string;
1489
+ /**
1490
+ * Inject the complete router state. This includes the current route data, path params, query params, title and fragment.
1491
+ */
1492
+ declare const injectRouterState: () => Signal<RouterState>;
1493
+ /** Inject a signal containing the current route fragment (the part after the # inside the url if present) */
1494
+ declare const injectFragment: <T = string | null>(config?: InjectUtilConfig & InjectUtilTransformConfig<string | null, T>) => Signal<T>;
1495
+ /** Inject all currently available query parameters as a signal */
1496
+ declare const injectQueryParams: () => Signal<Params>;
1497
+ /** Inject all currently available route data as a signal */
1498
+ declare const injectRouteData: () => Signal<Data>;
1499
+ /** Inject the current route title as a signal */
1500
+ declare const injectRouteTitle: <T = string | null>(config?: InjectUtilTransformConfig<string | null, T>) => Signal<T>;
1501
+ /** Inject all currently available path parameters as a signal */
1502
+ declare const injectPathParams: () => Signal<Params>;
1503
+ type InjectQueryParamConfig<T> = InjectUtilTransformConfig<string | null, T> & {
1504
+ /**
1505
+ * If true, the initial value will be read from the browser's url.
1506
+ * Note that this will not work with arrays or complex objects.
1507
+ */
1508
+ requireSync?: boolean;
1509
+ };
1510
+ /** Inject a specific query parameter as a signal */
1511
+ declare const injectQueryParam: <T = string | null>(key: string, config?: InjectQueryParamConfig<T>) => Signal<T>;
1512
+ /** Inject a specific route data item as a signal */
1513
+ declare const injectRouteDataItem: <T = unknown>(key: string, config?: InjectUtilTransformConfig<unknown, T>) => Signal<T>;
1514
+ /** Inject a specific path parameter as a signal */
1515
+ declare const injectPathParam: <T = string | null>(key: string, config?: InjectUtilTransformConfig<string | null, T>) => Signal<T>;
1516
+ /**
1517
+ * Inject query params that changed during navigation. Unchanged query params will be ignored.
1518
+ * Removed query params will be represented by the symbol `ET_PROPERTY_REMOVED`.
1519
+ */
1520
+ declare const injectQueryParamChanges: () => Signal<Record<string, unknown>>;
1521
+ /**
1522
+ * Inject path params that changed during navigation. Unchanged path params will be ignored.
1523
+ * Removed path params will be represented by the symbol `ET_PROPERTY_REMOVED`.
1524
+ */
1525
+ declare const injectPathParamChanges: () => Signal<Record<string, unknown>>;
1526
+
1527
+ declare class ScrollObserverDirective {
1528
+ private elementRef;
1529
+ enabled: _angular_core.ModelSignal<MaybeSignal<boolean>>;
1530
+ private enabledValue;
1531
+ private _startEl;
1532
+ private _endEl;
1533
+ private _startIntersection;
1534
+ private _endIntersection;
1535
+ isAtStart: Signal<boolean>;
1536
+ isAtEnd: Signal<boolean>;
1537
+ _registerStart(el: ElementRef<HTMLElement>): void;
1538
+ _registerEnd(el: ElementRef<HTMLElement>): void;
1539
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ScrollObserverDirective, never>;
1540
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ScrollObserverDirective, "[etScrollObserver]", ["etScrollObserver"], { "enabled": { "alias": "enabled"; "required": false; "isSignal": true; }; }, { "enabled": "enabledChange"; }, never, never, true, never>;
1541
+ }
1542
+
1543
+ type DragStartEvent = {
1544
+ /** Pointer position at pointerdown — NOT at commit-threshold crossing. */
1545
+ readonly clientX: number;
1546
+ readonly clientY: number;
1547
+ };
1548
+ type DragMoveEvent = {
1549
+ readonly stepX: number;
1550
+ readonly stepY: number;
1551
+ readonly clientX: number;
1552
+ readonly clientY: number;
1553
+ /** Cumulative delta from the pointerdown position. */
1554
+ readonly totalDx: number;
1555
+ readonly totalDy: number;
1556
+ };
1557
+ declare class DragHandleDirective {
1558
+ private el;
1559
+ commitThreshold: _angular_core.InputSignal<number>;
1560
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1561
+ private gestureStart$;
1562
+ private gesture$;
1563
+ dragTapped: _angular_core.OutputRef<void>;
1564
+ dragStarted: _angular_core.OutputRef<DragStartEvent>;
1565
+ dragMoved: _angular_core.OutputRef<DragMoveEvent>;
1566
+ dragEnded: _angular_core.OutputRef<void>;
1567
+ isDragging: _angular_core.Signal<boolean>;
1568
+ constructor();
1569
+ startGesture(event: PointerEvent): void;
1570
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DragHandleDirective, never>;
1571
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DragHandleDirective, "[etDragHandle]", never, { "commitThreshold": { "alias": "commitThreshold"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "dragTapped": "dragTapped"; "dragStarted": "dragStarted"; "dragMoved": "dragMoved"; "dragEnded": "dragEnded"; }, never, never, true, never>;
1572
+ }
1573
+
1574
+ type OverlayRuntimeRole = 'dialog' | 'alertdialog';
1575
+ type OverlayRuntimeAutoFocusTarget = 'container' | 'first-heading' | 'first-tabbable';
1576
+ type OverlayRuntimeCloseSource = 'api' | 'escape' | 'outside-pointer' | 'drag' | 'reference-detached';
1577
+ type OverlayRuntimeCenteredPosition = {
1578
+ kind: 'center';
1579
+ };
1580
+ type OverlayRuntimeGlobalPositionAlignment = 'start' | 'center' | 'end' | 'stretch';
1581
+ type OverlayRuntimeGlobalPosition = {
1582
+ kind: 'global';
1583
+ /** Horizontal placement of the pane inside the viewport. Defaults to `center`. */
1584
+ horizontal?: OverlayRuntimeGlobalPositionAlignment;
1585
+ /** Vertical placement of the pane inside the viewport. Defaults to `center`. */
1586
+ vertical?: OverlayRuntimeGlobalPositionAlignment;
1587
+ /** Padding applied to the host element. Defaults to `0`. */
1588
+ padding?: string;
1589
+ };
1590
+ type OverlayRuntimeShiftOptions = {
1591
+ /**
1592
+ * Also shift along the placement's cross axis (e.g. horizontally for a `right-*` placement)
1593
+ * when no placement fits the viewport. The pane may then overlap its reference element —
1594
+ * desirable for nested menus, usually not for tooltips. Defaults to `false`.
1595
+ */
1596
+ crossAxis?: boolean;
1597
+ };
1598
+ type OverlayRuntimeAnchoredPosition = {
1599
+ kind: 'anchored';
1600
+ referenceElement: HTMLElement | VirtualElement;
1601
+ placement?: Placement;
1602
+ fallbackPlacements?: Placement[];
1603
+ offset?: OffsetOptions | null;
1604
+ arrowPadding?: Padding | null;
1605
+ viewportPadding?: Padding | null;
1606
+ autoResize?: boolean;
1607
+ shift?: boolean | OverlayRuntimeShiftOptions;
1608
+ autoHide?: boolean;
1609
+ autoCloseIfReferenceHidden?: boolean;
1610
+ mirrorWidth?: boolean;
1611
+ /**
1612
+ * Clipping element(s) the pane must stay within when flipping/shifting, instead of the default
1613
+ * viewport (`clippingAncestors`). Use it to keep an anchored pane inside a specific region — e.g.
1614
+ * a rich-text editor's content area, so its selection toolbar flips below rather than covering the
1615
+ * static toolbar above.
1616
+ */
1617
+ boundary?: Element | Element[];
1618
+ };
1619
+ type OverlayRuntimePositionStrategy = OverlayRuntimeCenteredPosition | OverlayRuntimeAnchoredPosition | OverlayRuntimeGlobalPosition;
1620
+ type OverlayRuntimeElements = {
1621
+ rootElement: HTMLElement;
1622
+ hostElement: HTMLElement;
1623
+ backdropElement: HTMLElement | null;
1624
+ paneElement: HTMLElement;
1625
+ };
1626
+ type OverlayRuntimeCloseEvent<TResult = unknown> = {
1627
+ result: TResult | undefined;
1628
+ source: OverlayRuntimeCloseSource;
1629
+ };
1630
+ /**
1631
+ * A synchronous veto for a pending close. Return `false` to cancel the close (the overlay stays
1632
+ * open); return `true` to let it proceed. Registered via `overlayRef.registerCloseGuard`. An async
1633
+ * decision (e.g. a confirm dialog) lives in the guard's owner, which re-issues the close through
1634
+ * `overlayRef.forceClose` once resolved. `reference-detached` closes bypass all guards.
1635
+ */
1636
+ type OverlayRuntimeCloseGuard<TResult = unknown> = (event: OverlayRuntimeCloseEvent<TResult>) => boolean;
1637
+ type OverlayRuntimeComponentBase = {
1638
+ animatedLifecycle?: Signal<AnimatedLifecycleDirective | undefined>;
1639
+ };
1640
+ type OverlayRuntimeAnimationDelegateEnterContext = {
1641
+ lifecycle: AnimatedLifecycleDirective;
1642
+ elements: OverlayRuntimeElements;
1643
+ };
1644
+ type OverlayRuntimeAnimationDelegateLeaveContext = OverlayRuntimeAnimationDelegateEnterContext & {
1645
+ closeEvent: OverlayRuntimeCloseEvent;
1646
+ };
1647
+ /**
1648
+ * Overrides the runtime's default enter/leave animation handling.
1649
+ * A delegate must eventually drive the lifecycle state to `entered` (enter) or `left` (leave),
1650
+ * otherwise the overlay will never finish opening or closing.
1651
+ */
1652
+ type OverlayRuntimeAnimationDelegate = {
1653
+ enter?: (context: OverlayRuntimeAnimationDelegateEnterContext) => void;
1654
+ leave?: (context: OverlayRuntimeAnimationDelegateLeaveContext) => void;
1655
+ };
1656
+ type OverlayRuntimeMountConfig<TComponent extends object> = {
1657
+ id: string;
1658
+ component: Type<TComponent>;
1659
+ viewContainerRef?: ViewContainerRef;
1660
+ injector?: Injector;
1661
+ providers?: StaticProvider[];
1662
+ role?: OverlayRuntimeRole;
1663
+ positionStrategy?: OverlayRuntimePositionStrategy;
1664
+ hasBackdrop?: boolean;
1665
+ modal?: boolean;
1666
+ autoFocus?: OverlayRuntimeAutoFocusTarget | string | false;
1667
+ restoreFocus?: boolean;
1668
+ closeOnEscape?: boolean;
1669
+ closeOnOutsidePointer?: boolean;
1670
+ ariaDescribedBy?: string | null;
1671
+ ariaLabelledBy?: string | null;
1672
+ ariaLabel?: string | null;
1673
+ hostClass?: string[];
1674
+ backdropClass?: string[];
1675
+ paneClass?: string[];
1676
+ /**
1677
+ * Bindings applied to the mounted component, using Angular's native binding API
1678
+ * (`inputBinding`, `outputBinding`, `twoWayBinding`).
1679
+ */
1680
+ bindings?: Binding[];
1681
+ animationDelegate?: OverlayRuntimeAnimationDelegate;
1682
+ };
1683
+
1684
+ type OverlayRuntimeState = 'mounting' | 'mounted' | 'closing' | 'closed';
1685
+ declare const createOverlayRuntimeRef: <TComponent extends object, TResult = unknown>(id: string, config: Omit<OverlayRuntimeMountConfig<TComponent>, "component">, elements: OverlayRuntimeElements, requestClose: (result: TResult | undefined, source: OverlayRuntimeCloseSource) => void) => {
1686
+ id: string;
1687
+ config: Omit<OverlayRuntimeMountConfig<TComponent>, "component">;
1688
+ elements: OverlayRuntimeElements;
1689
+ state: _angular_core.Signal<OverlayRuntimeState>;
1690
+ componentInstance: _angular_core.Signal<TComponent | null>;
1691
+ beforeOpenedSubject: Subject<void>;
1692
+ close(result?: TResult, source?: OverlayRuntimeCloseSource): void;
1693
+ /** Close bypassing every registered close guard — used by a guard's owner to commit a
1694
+ * close it previously vetoed (e.g. after an async confirm resolved). */
1695
+ forceClose(result?: TResult, source?: OverlayRuntimeCloseSource): void;
1696
+ /** Register a synchronous veto for pending closes. Returns an unregister function. */
1697
+ registerCloseGuard(guard: OverlayRuntimeCloseGuard<TResult>): () => void;
1698
+ beforeOpened(): Observable<void>;
1699
+ afterOpened(): Observable<void>;
1700
+ beforeClosed(): Observable<OverlayRuntimeCloseEvent<TResult>>;
1701
+ afterClosed(): Observable<OverlayRuntimeCloseEvent<TResult>>;
1702
+ attachComponentRef(componentRef: ComponentRef<TComponent>): void;
1703
+ /** @internal */
1704
+ attachPositionUpdater(updater: (strategy: OverlayRuntimePositionStrategy) => void): void;
1705
+ updatePositionStrategy(strategy: OverlayRuntimePositionStrategy): void;
1706
+ markOpened(): void;
1707
+ beginClose(closeEvent: OverlayRuntimeCloseEvent<TResult>): boolean;
1708
+ finishClose(closeEvent: OverlayRuntimeCloseEvent<TResult>): void;
1709
+ };
1710
+ type OverlayRuntimeRef<TComponent extends object = object, TResult = unknown> = ReturnType<typeof createOverlayRuntimeRef<TComponent, TResult>>;
1711
+
1712
+ declare const FOCUSABLE_SELECTOR: string;
1713
+ declare const isHTMLElement: (value: unknown) => value is HTMLElement;
1714
+ declare const isFocusable: (element: HTMLElement, document: Document) => boolean;
1715
+ declare const getFocusableElements: (container: HTMLElement, document: Document) => HTMLElement[];
1716
+ declare const getHeadingElement: (container: HTMLElement) => HTMLElement | null;
1717
+ declare const focusElement: (element: HTMLElement | null) => void;
1718
+ declare const applyInitialFocus: (paneElement: HTMLElement, autoFocus: OverlayRuntimeAutoFocusTarget | string | false, document: Document) => void;
1719
+ declare const setupFocusTrap: (paneElement: HTMLElement, overlayRef: OverlayRuntimeRef<object, unknown>, enabled: boolean, isTopMost: (ref: OverlayRuntimeRef<object, unknown>) => boolean, document: Document) => () => void;
1720
+
1721
+ declare const setBaseElementStyles: (config: OverlayRuntimeMountConfig<object>, hostElement: HTMLElement, paneElement: HTMLElement, renderer: AngularRenderer) => void;
1722
+ declare const setBackdropStyles: (backdropElement: HTMLElement, renderer: AngularRenderer) => void;
1723
+ declare const applyCenteredPosition: (hostElement: HTMLElement, paneElement: HTMLElement, renderer: AngularRenderer, _config: OverlayRuntimeCenteredPosition) => void;
1724
+ declare const applyGlobalPosition: (hostElement: HTMLElement, paneElement: HTMLElement, renderer: AngularRenderer, config: OverlayRuntimeGlobalPosition) => void;
1725
+ /**
1726
+ * Clears every inline style any position strategy kind may have set and
1727
+ * restores the base element styles, so a different strategy can be applied afterwards.
1728
+ */
1729
+ declare const resetPositioningStyles: (config: OverlayRuntimeMountConfig<object>, hostElement: HTMLElement, paneElement: HTMLElement, renderer: AngularRenderer) => void;
1730
+ declare const createAnchoredPositionCleanup: (strategy: OverlayRuntimeAnchoredPosition, paneElement: HTMLElement, overlayRef: OverlayRuntimeRef<object, unknown>, renderer: AngularRenderer) => () => void;
1731
+ declare const setupPositioning: (config: OverlayRuntimeMountConfig<object>, hostElement: HTMLElement, paneElement: HTMLElement, overlayRef: OverlayRuntimeRef<object, unknown>, renderer: AngularRenderer) => () => void;
1732
+
1733
+ type OverlayRuntime = {
1734
+ mount: <TComponent extends object, TResult = unknown>(config: OverlayRuntimeMountConfig<TComponent>) => OverlayRuntimeRef<TComponent, TResult>;
1735
+ openEntries: ReturnType<typeof computed<OverlayRuntimeRef<object, unknown>[]>>;
1736
+ };
1737
+ declare const provideOverlayRuntime: () => _angular_core.Provider[];
1738
+ declare const injectOverlayRuntime: {
1739
+ (): OverlayRuntime;
1740
+ (options: _angular_core.InjectOptions & {
1741
+ optional?: false;
1742
+ }): OverlayRuntime;
1743
+ (options: _angular_core.InjectOptions): OverlayRuntime | null;
1744
+ };
1745
+
1746
+ declare const createComponentId: (prefix: string) => string;
1747
+ /**
1748
+ * A unique id string. Uses `crypto.randomUUID()` when available, but falls back gracefully when it is
1749
+ * not — crucially in **insecure contexts** (a plain-HTTP page served from a LAN IP, not `localhost`),
1750
+ * where `crypto.randomUUID` is `undefined`. Calling it there throws, so anything using it during e.g.
1751
+ * an overlay/menu open would break on such hosts. Prefer this over `crypto.randomUUID()` directly.
1752
+ */
1753
+ declare const randomId: () => string;
1754
+
1755
+ declare const createDestroy: () => rxjs.Observable<boolean>;
1756
+
1757
+ declare const injectHostElement: <T = HTMLElement>() => T;
1758
+ declare const injectTemplateRef: <C = unknown>() => TemplateRef<C>;
1759
+ type CreateProviderOptions = {
1760
+ /**
1761
+ * Optional name for the provider, useful for debugging.
1762
+ * If not provided, the name will be a generated string.
1763
+ */
1764
+ name?: string;
1765
+ /**
1766
+ * Optional existing InjectionToken to also provide the created provider under.
1767
+ */
1768
+ extraInjectionToken?: InjectionToken<unknown>;
1769
+ };
1770
+ type ProviderResult<T> = readonly [
1771
+ provide: () => Provider[],
1772
+ inject: {
1773
+ (): T;
1774
+ (options: InjectOptions & {
1775
+ optional?: false;
1776
+ }): T;
1777
+ (options: InjectOptions): T | null;
1778
+ },
1779
+ token: InjectionToken<T>
1780
+ ];
1781
+ type StaticProviderResult<T> = readonly [
1782
+ provide: (valueOverride?: Partial<T>) => Provider[],
1783
+ inject: {
1784
+ (): T;
1785
+ (options: InjectOptions & {
1786
+ optional?: false;
1787
+ }): T;
1788
+ (options: InjectOptions): T | null;
1789
+ },
1790
+ token: InjectionToken<T>
1791
+ ];
1792
+ type RootProviderResult<T> = readonly [
1793
+ inject: {
1794
+ (): T;
1795
+ (options: InjectOptions & {
1796
+ optional?: false;
1797
+ }): T;
1798
+ (options: InjectOptions): T | null;
1799
+ },
1800
+ token: InjectionToken<T>
1801
+ ];
1802
+ declare const createProvider: <T>(factory: () => T, options?: CreateProviderOptions) => ProviderResult<T>;
1803
+ declare const createRootProvider: <T>(factory: () => T, options?: CreateProviderOptions) => ProviderResult<T>;
1804
+ declare const createStaticProvider: <T>(defaultValue?: T, options?: CreateProviderOptions) => StaticProviderResult<T>;
1805
+ declare const createStaticRootProvider: <T>(defaultValue?: T, options?: CreateProviderOptions) => StaticProviderResult<T>;
1806
+
1807
+ declare const cloneFormGroup: <T extends FormGroup<any>>(formGroup: T) => T;
1808
+ declare const getFormGroupValue: <T extends FormGroup>(formGroup: T) => Record<string, unknown>;
1809
+
1810
+ declare const createRxHostListener: <K extends keyof HTMLElementEventMap>(eventName: K, options?: EventListenerOptions) => rxjs.Observable<HTMLElementEventMap[K]>;
1811
+ declare const applyHostListener: <K extends keyof HTMLElementEventMap>(eventName: K, handler: (event: HTMLElementEventMap[K]) => void, options?: EventListenerOptions) => rxjs.Subscription;
1812
+ declare const applyHostListeners: (listeners: Partial<{ [K in keyof HTMLElementEventMap]: (event: HTMLElementEventMap[K]) => void; }>, options?: EventListenerOptions) => void;
1813
+
1814
+ declare class TypedQueryList<T> extends QueryList<T> {
1815
+ get changes(): Observable<TypedQueryList<T>>;
1816
+ }
1817
+ declare function switchQueryListChanges(): <T extends TypedQueryList<unknown> | null | undefined>(source: Observable<T>) => Observable<T>;
1818
+
1819
+ /**
1820
+ * Sets the value of an input signal.
1821
+ * See issue: https://github.com/angular/angular/issues/54782
1822
+ */
1823
+ declare const setInputSignal: <T>(input: InputSignal<T> | InputSignalWithTransform<T, unknown>, value: T) => void;
1824
+
1825
+ type NgClassType = string | string[] | Set<string> | {
1826
+ [klass: string]: any;
1827
+ } | null | undefined;
1828
+
1829
+ declare const AT_LEAST_ONE_REQUIRED = "atLeastOneRequired";
1830
+ type ValidateAtLeastOneRequiredConfig = {
1831
+ /**
1832
+ * Keys of form controls to validate in the supplied form group
1833
+ */
1834
+ keys: string[];
1835
+ /**
1836
+ * If true, the value `false` will result in a validation error
1837
+ * @default false
1838
+ */
1839
+ checkFalse?: boolean;
1840
+ };
1841
+ declare const ValidateAtLeastOneRequired: (config: ValidateAtLeastOneRequiredConfig) => ValidatorFn;
1842
+ declare const IS_ARRAY_NOT_EMPTY = "isArrayNotEmpty";
1843
+ declare const IsArrayNotEmpty: (control: AbstractControl) => ValidationErrors | null;
1844
+ declare const IS_EMAIL = "isEmail";
1845
+ declare const IsEmail: (control: AbstractControl) => ValidationErrors | null;
1846
+ declare const MUST_MATCH = "mustMatch";
1847
+ declare const MustMatch: (controlName: string, matchingControlName: string) => (formGroup: AbstractControl) => {
1848
+ mustMatch: boolean;
1849
+ } | null;
1850
+ declare const Validators: {
1851
+ readonly MustMatch: (controlName: string, matchingControlName: string) => (formGroup: AbstractControl) => {
1852
+ mustMatch: boolean;
1853
+ } | null;
1854
+ readonly IsEmail: (control: AbstractControl) => ValidationErrors | null;
1855
+ readonly IsArrayNotEmpty: (control: AbstractControl) => ValidationErrors | null;
1856
+ readonly ValidateAtLeastOneRequired: (config: ValidateAtLeastOneRequiredConfig) => ValidatorFn;
1857
+ };
1858
+
1859
+ declare const copyToClipboard: (text: string) => Observable<boolean>;
1860
+ declare const readFromClipboard: () => Observable<string | null>;
1861
+
1862
+ declare const clone: <T>(original: T) => T;
1863
+ declare const equal: (foo: any, bar: any) => boolean;
1864
+
1865
+ declare const hasCookie: (name: string) => boolean;
1866
+ declare const getCookie: (name: string) => string | null | undefined;
1867
+ declare const setCookie: (name: string, data: string, expiresInDays?: number | null, domain?: string | null, path?: string, sameSite?: "strict" | "none" | "lax") => void;
1868
+ declare const deleteCookie: (name: string, path?: string, domain?: string | null) => void;
1869
+ declare const getDomain: () => string | null;
1870
+
1871
+ type Translatable = {
1872
+ i18n: string;
1873
+ text: string;
1874
+ };
1875
+
1876
+ declare class KeyPressManager {
1877
+ readonly key: number;
1878
+ private readonly _isKeyPressed$;
1879
+ private readonly _keyPressCount$;
1880
+ private readonly _stopTimeout$;
1881
+ constructor(key: number);
1882
+ isPressed(event: KeyboardEvent): boolean;
1883
+ clear(): void;
1884
+ }
1885
+
1886
+ declare const DISABLE_LOGGER_PARAM = "et-logger-quiet";
1887
+ type CreateLoggerConfig = {
1888
+ scope: string;
1889
+ feature: string;
1890
+ };
1891
+ declare const createLogger: (config: CreateLoggerConfig) => {
1892
+ log: (...args: unknown[]) => void;
1893
+ warn: (...args: unknown[]) => void;
1894
+ error: (...args: unknown[]) => void;
1895
+ };
1896
+
1897
+ /**
1898
+ * Converts a markdown string to HTML.
1899
+ * Covers headings, bold, italic, strikethrough, inline code, fenced code blocks,
1900
+ * links, images, block quotes, unordered/ordered (and nested) lists, tables, horizontal rules, and paragraphs.
1901
+ */
1902
+ declare const markdownToHtml: (markdown: string) => string;
1903
+ /**
1904
+ * Converts an HTML string to markdown.
1905
+ * Covers headings, bold, italic, strikethrough, inline code, fenced code blocks,
1906
+ * links, images, block quotes, unordered/ordered lists, tables, horizontal rules, and paragraphs.
1907
+ */
1908
+ declare const htmlToMarkdown: (html: string) => string;
1909
+
1910
+ declare const clamp: (value: number, min?: number, max?: number) => number;
1911
+ declare const round: (value: number, precision?: number) => number;
1912
+
1913
+ declare const isObject: (value: unknown) => value is Record<string, unknown>;
1914
+ declare const isArray: (value: unknown) => value is unknown[];
1915
+ declare const getObjectProperty: (obj: Record<string, unknown>, prop: string) => unknown;
1916
+
1917
+ declare const RUNTIME_ERROR_NO_DATA = "__ET_NO_DATA__";
1918
+ declare class RuntimeError<T extends number> extends Error {
1919
+ code: T;
1920
+ data: unknown;
1921
+ constructor(code: T, message: null | false | string, data?: unknown);
1922
+ }
1923
+ declare function formatRuntimeError<T extends number>(code: T, message: null | false | string): string;
1924
+
1925
+ type CreateSessionMemoryConfig<TValue> = {
1926
+ key: string;
1927
+ parse: (storedValue: string) => TValue | null;
1928
+ serialize: (value: TValue) => string;
1929
+ };
1930
+ declare const createAutoSessionMemoryKey: ({ element, prefix }: {
1931
+ element: HTMLElement;
1932
+ prefix: string;
1933
+ }) => string;
1934
+ declare const canUseSessionMemory: () => boolean;
1935
+ declare const createSessionMemory: <TValue>({ key, parse, serialize }: CreateSessionMemoryConfig<TValue>) => {
1936
+ read: () => TValue | null;
1937
+ write: (value: TValue) => boolean;
1938
+ remove: () => boolean;
1939
+ };
1940
+
1941
+ type SwipeTracker = {
1942
+ update(event: TouchEvent | MouseEvent): SwipeUpdateEvent;
1943
+ end(): SwipeEndEvent;
1944
+ cancel(): void;
1945
+ };
1946
+ type SwipeEndEvent = {
1947
+ positivePixelPerSecondX: number;
1948
+ positivePixelPerSecondY: number;
1949
+ pixelPerSecondX: number;
1950
+ pixelPerSecondY: number;
1951
+ movementX: number;
1952
+ movementY: number;
1953
+ positiveMovementX: number;
1954
+ positiveMovementY: number;
1955
+ originClientX: number;
1956
+ originClientY: number;
1957
+ };
1958
+ type SwipeUpdateEvent = {
1959
+ originClientX: number;
1960
+ originClientY: number;
1961
+ timestamp: number;
1962
+ movementX: number;
1963
+ movementY: number;
1964
+ positiveMovementX: number;
1965
+ positiveMovementY: number;
1966
+ isScrolling: boolean;
1967
+ isSwiping: boolean;
1968
+ };
1969
+ declare const createSwipeTracker: (startEvent: TouchEvent | MouseEvent) => SwipeTracker;
1970
+
1971
+ declare class NormalizeGameResultTypePipe implements PipeTransform {
1972
+ transform: (type: string | null) => NormalizedGameResultType | null;
1973
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NormalizeGameResultTypePipe, never>;
1974
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<NormalizeGameResultTypePipe, "etNormalizeGameResultType", true>;
1975
+ }
1976
+ type NormalizedGameResultType = Translatable & {
1977
+ shortCode: string;
1978
+ };
1979
+ declare const normalizeGameResultType: (type: string | null) => NormalizedGameResultType | null;
1980
+
1981
+ declare class NormalizeMatchParticipantsPipe implements PipeTransform {
1982
+ transform: (match: MatchListView | null) => NormalizedMatchParticipants | null;
1983
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NormalizeMatchParticipantsPipe, never>;
1984
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<NormalizeMatchParticipantsPipe, "etNormalizeMatchParticipants", true>;
1985
+ }
1986
+ type NormalizedMatchParticipants = {
1987
+ home: NormalizedMatchParticipant | null;
1988
+ away: NormalizedMatchParticipant | null;
1989
+ };
1990
+ type NormalizedParticipantType = 'team' | 'player' | 'unknown';
1991
+ type NormalizedMatchParticipant = ({
1992
+ type: 'tbd';
1993
+ participantType: NormalizedParticipantType;
1994
+ data: ParticipantViewUnion | null;
1995
+ } & Translatable) | {
1996
+ type: 'participant';
1997
+ participantType: NormalizedParticipantType;
1998
+ data: ParticipantViewUnion;
1999
+ } | ({
2000
+ type: 'none';
2001
+ participantType: NormalizedParticipantType;
2002
+ data: ParticipantViewUnion | null;
2003
+ } & Translatable);
2004
+ declare const normalizeMatchParticipants: (match: MatchListView | null) => NormalizedMatchParticipants | null;
2005
+ declare const normalizeMatchParticipant: (match: MatchListView | null, side: "home" | "away") => NormalizedMatchParticipant | null;
2006
+
2007
+ declare class NormalizeMatchScorePipe implements PipeTransform {
2008
+ transform: (match: MatchListView | null | undefined) => NormalizedMatchScore | null;
2009
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NormalizeMatchScorePipe, never>;
2010
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<NormalizeMatchScorePipe, "etNormalizeMatchScore", true>;
2011
+ }
2012
+ declare const enum MatchStateType {
2013
+ PREPARING_ROUND = "preparingRound",
2014
+ PRE_MATCH = "preMatch",
2015
+ LIVE = "live",
2016
+ POST_MATCH = "postMatch",
2017
+ AUTO_WIN = "autoWin"
2018
+ }
2019
+ type NormalizedMatchScore = {
2020
+ home: {
2021
+ score: string | number | null;
2022
+ isWinner: boolean;
2023
+ };
2024
+ away: {
2025
+ score: string | number | null;
2026
+ isWinner: boolean;
2027
+ };
2028
+ subLine: string | null;
2029
+ isNumeric: boolean;
2030
+ };
2031
+ declare const normalizeMatchScore: (match: MatchListView | null | undefined) => NormalizedMatchScore | null;
2032
+ declare const isKnockoutMatch: (match: MatchListView | null | undefined) => boolean;
2033
+ declare const isGroupMatch: (match: MatchListView | null | undefined) => boolean;
2034
+ declare const getKnockoutMatchScore: (score: MatchRankingView | null | undefined) => "match-score.knockout.won" | "match-score.knockout.lost" | "match-score.knockout.tie" | null;
2035
+ declare const getMatchScoreSubLine: (match: MatchListView | null | undefined) => "match-score.groups.sub-line" | null;
2036
+ declare const getGroupMatchScore: (match: MatchListView | null | undefined) => {
2037
+ home: {
2038
+ score: number;
2039
+ isWinner: boolean;
2040
+ };
2041
+ away: {
2042
+ score: number;
2043
+ isWinner: boolean;
2044
+ };
2045
+ } | null;
2046
+ declare const getGroupMatchPoints: (match: MatchListView | null | undefined) => {
2047
+ home: {
2048
+ score: number;
2049
+ isWinner: boolean;
2050
+ };
2051
+ away: {
2052
+ score: number;
2053
+ isWinner: boolean;
2054
+ };
2055
+ } | null;
2056
+
2057
+ declare class NormalizeMatchStatePipe implements PipeTransform {
2058
+ transform: (match: MatchListView | null | undefined) => MatchStateType | null;
2059
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NormalizeMatchStatePipe, never>;
2060
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<NormalizeMatchStatePipe, "etNormalizeMatchState", true>;
2061
+ }
2062
+ declare const normalizeMatchState: (match: MatchListView | null | undefined) => MatchStateType | null;
2063
+
2064
+ declare class NormalizeMatchTypePipe implements PipeTransform {
2065
+ transform: (matchType: StageType | null | undefined) => Translatable | null;
2066
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NormalizeMatchTypePipe, never>;
2067
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<NormalizeMatchTypePipe, "etNormalizeMatchType", true>;
2068
+ }
2069
+ declare const normalizeMatchType: (matchType: StageType | null | undefined) => Translatable | null;
2070
+
2071
+ declare class HtmlToMarkdownPipe implements PipeTransform {
2072
+ transform: (html: string) => string;
2073
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HtmlToMarkdownPipe, never>;
2074
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<HtmlToMarkdownPipe, "htmlToMarkdown", true>;
2075
+ }
2076
+
2077
+ declare class InferMimeTypePipe implements PipeTransform {
2078
+ transform: (srcset: string) => string | null;
2079
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<InferMimeTypePipe, never>;
2080
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<InferMimeTypePipe, "inferMimeType", true>;
2081
+ }
2082
+ /**
2083
+ * Infers the mime type of a given url or srcset.
2084
+ * If a srcset is provided, it will infer the mime type of the first url in the srcset.
2085
+ * If the srcset contains a query parameter `?fm=`, it will use the value of that parameter, since it is often used to specify the file format in image api's like contentful.
2086
+ */
2087
+ declare const inferMimeType: (srcset: string) => string | null;
2088
+
2089
+ declare class InitialsPipe implements PipeTransform {
2090
+ transform: (value: string | null | undefined, maxLength?: number) => string;
2091
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<InitialsPipe, never>;
2092
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<InitialsPipe, "initials", true>;
2093
+ }
2094
+ /**
2095
+ * Extracts the initials from a name (or any whitespace separated string).
2096
+ *
2097
+ * Words are split on whitespace, and the first character of each word is taken.
2098
+ * At most `maxLength` initials are returned (defaults to 2), always uppercased.
2099
+ *
2100
+ * @example
2101
+ * initials('John Doe') // 'JD'
2102
+ * initials('john doe smith') // 'JD'
2103
+ * initials('john doe smith', 3) // 'JDS'
2104
+ * initials('Madonna') // 'M'
2105
+ * initials(' ') // ''
2106
+ * initials(null) // ''
2107
+ */
2108
+ declare const initials: (value: string | null | undefined, maxLength?: number) => string;
2109
+
2110
+ declare class MarkdownToHtmlPipe implements PipeTransform {
2111
+ transform: (markdown: string) => string;
2112
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MarkdownToHtmlPipe, never>;
2113
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<MarkdownToHtmlPipe, "markdownToHtml", true>;
2114
+ }
2115
+
2116
+ declare class SlugifyPipe implements PipeTransform {
2117
+ transform: (value: string | null | undefined) => string;
2118
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SlugifyPipe, never>;
2119
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<SlugifyPipe, "slugify", true>;
2120
+ }
2121
+ /**
2122
+ * Converts a string into a URL-friendly slug.
2123
+ *
2124
+ * Diacritics are stripped, the string is lowercased, and any run of
2125
+ * non-alphanumeric characters becomes a single hyphen. Leading/trailing
2126
+ * hyphens are trimmed.
2127
+ *
2128
+ * @example
2129
+ * slugify('Hello World') // 'hello-world'
2130
+ * slugify(' Crème brûlée! ') // 'creme-brulee'
2131
+ * slugify('FC Bayern München') // 'fc-bayern-munchen'
2132
+ * slugify('foo_bar / baz') // 'foo-bar-baz'
2133
+ * slugify(null) // ''
2134
+ */
2135
+ declare const slugify: (value: string | null | undefined) => string;
2136
+
2137
+ declare class ToArrayPipe implements PipeTransform {
2138
+ transform: (value: number) => number[];
2139
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ToArrayPipe, never>;
2140
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<ToArrayPipe, "toArray", true>;
2141
+ }
2142
+ declare const toArray: (value: number) => number[];
2143
+ declare const toArrayTrackByFn: TrackByFunction<number>;
2144
+
2145
+ declare const createPropHandlers: () => {
2146
+ classes: {
2147
+ remove: (tokens: string) => void;
2148
+ removeMany: (tokens: string[]) => void;
2149
+ has: (tokens: string) => boolean;
2150
+ push: (tokens: string, signal: _angular_core.Signal<unknown>) => void;
2151
+ pushMany: (map: Record<string, _angular_core.Signal<unknown>>) => void;
2152
+ };
2153
+ attributes: {
2154
+ remove: (tokens: string) => void;
2155
+ removeMany: (tokens: string[]) => void;
2156
+ has: (tokens: string) => boolean;
2157
+ push: (tokens: string, signal: _angular_core.Signal<unknown>) => void;
2158
+ pushMany: (map: Record<string, _angular_core.Signal<unknown>>) => void;
2159
+ };
2160
+ styles: {
2161
+ remove: (tokens: string) => void;
2162
+ removeMany: (tokens: string[]) => void;
2163
+ has: (tokens: string) => boolean;
2164
+ push: (tokens: string, signal: _angular_core.Signal<unknown>) => void;
2165
+ pushMany: (map: Record<string, _angular_core.Signal<unknown>>) => void;
2166
+ };
2167
+ id: string;
2168
+ elementRef: ElementRef<HTMLElement>;
2169
+ };
2170
+ type PropHandlers = ReturnType<typeof createPropHandlers>;
2171
+
2172
+ type Props = Readonly<{
2173
+ attached: Signal<boolean>;
2174
+ attachedElements: PropsAttachedElements;
2175
+ }>;
2176
+ type PropsAttachedElements = {
2177
+ first: Signal<HTMLElement | null>;
2178
+ firstId: Signal<string | null>;
2179
+ get(id: string): HTMLElement | null;
2180
+ };
2181
+ type PropsAttachedElementsInternal = PropsAttachedElements & {
2182
+ has: (id: string) => boolean;
2183
+ push: (id: string, element: HTMLElement) => void;
2184
+ remove: (id: string) => void;
2185
+ };
2186
+ type PropsInternal = {
2187
+ single: boolean;
2188
+ name: string;
2189
+ bindId: boolean;
2190
+ attached: Signal<boolean>;
2191
+ attachedElements: PropsAttachedElementsInternal;
2192
+ classBindings: Record<string, Signal<unknown>> | null;
2193
+ attributeBindings: Record<string, Signal<unknown>> | null;
2194
+ styleBindings: Record<string, Signal<unknown>> | null;
2195
+ staticClassBindings: string[] | null;
2196
+ staticAttributeBindings: Record<string, unknown> | null;
2197
+ staticStyleBindings: Record<string, unknown> | null;
2198
+ attachEventListeners: ((context: {
2199
+ on: HTMLElement['addEventListener'];
2200
+ element: HTMLElement;
2201
+ }) => void) | null;
2202
+ };
2203
+ type CreatePropsOptions = {
2204
+ name: string;
2205
+ bindId?: boolean;
2206
+ single?: boolean;
2207
+ classes?: Record<string, Signal<unknown>>;
2208
+ attributes?: Record<string, Signal<unknown>>;
2209
+ styles?: Record<string, Signal<unknown>>;
2210
+ staticClasses?: string[];
2211
+ staticAttributes?: Record<string, unknown>;
2212
+ staticStyles?: Record<string, unknown>;
2213
+ listeners?: (context: {
2214
+ on: HTMLElement['addEventListener'];
2215
+ element: HTMLElement;
2216
+ }) => void;
2217
+ };
2218
+ declare const createProps: (props: CreatePropsOptions) => Props;
2219
+ type HostProps = {
2220
+ props: Props;
2221
+ handlers: PropHandlers;
2222
+ };
2223
+ declare const createHostProps: (props: CreatePropsOptions) => HostProps;
2224
+
2225
+ declare const createSetup: <T extends Record<string, unknown>>(config: {
2226
+ setupFn: (params: T) => void;
2227
+ this: ThisType<unknown>;
2228
+ }) => (params: T) => void;
2229
+
2230
+ declare const createDependencyStash: <T extends Record<string, WritableSignal<unknown>>>(stash: T) => T & {
2231
+ provideSignal: <K extends keyof T>(data: {
2232
+ signal: Signal<ReturnType<T[K]>>;
2233
+ for: K;
2234
+ }) => void;
2235
+ provideValue: <K extends keyof T>(data: {
2236
+ value: ReturnType<T[K]>;
2237
+ for: K;
2238
+ }) => void;
2239
+ };
2240
+
2241
+ declare const createElementDictionary: () => {
2242
+ ids: _angular_core.Signal<string[]>;
2243
+ elements: _angular_core.Signal<HTMLElement[]>;
2244
+ has: (id: string) => boolean;
2245
+ get: (id: string) => HTMLElement | null;
2246
+ push: (id: string, element: HTMLElement) => void;
2247
+ remove: (id: string) => void;
2248
+ isEmpty: _angular_core.Signal<boolean>;
2249
+ firstElement: _angular_core.Signal<HTMLElement | null>;
2250
+ firstId: _angular_core.Signal<string | null>;
2251
+ };
2252
+
2253
+ type BindPropsOptions = {
2254
+ props: Props | PropsInternal;
2255
+ handlers: PropHandlers;
2256
+ };
2257
+ declare const bindProps: (config: BindPropsOptions) => void;
2258
+ type UnbindPropsOptions = {
2259
+ props: Props | PropsInternal;
2260
+ handlers: PropHandlers;
2261
+ };
2262
+ declare const unbindProps: (config: UnbindPropsOptions) => void;
2263
+
2264
+ declare class PropsDirective {
2265
+ destroyRef: DestroyRef;
2266
+ props: _angular_core.InputSignalWithTransform<PropsInternal, Readonly<{
2267
+ attached: _angular_core.Signal<boolean>;
2268
+ attachedElements: _ethlete_core.PropsAttachedElements;
2269
+ }>>;
2270
+ propHandlers: {
2271
+ classes: {
2272
+ remove: (tokens: string) => void;
2273
+ removeMany: (tokens: string[]) => void;
2274
+ has: (tokens: string) => boolean;
2275
+ push: (tokens: string, signal: _angular_core.Signal<unknown>) => void;
2276
+ pushMany: (map: Record<string, _angular_core.Signal<unknown>>) => void;
2277
+ };
2278
+ attributes: {
2279
+ remove: (tokens: string) => void;
2280
+ removeMany: (tokens: string[]) => void;
2281
+ has: (tokens: string) => boolean;
2282
+ push: (tokens: string, signal: _angular_core.Signal<unknown>) => void;
2283
+ pushMany: (map: Record<string, _angular_core.Signal<unknown>>) => void;
2284
+ };
2285
+ styles: {
2286
+ remove: (tokens: string) => void;
2287
+ removeMany: (tokens: string[]) => void;
2288
+ has: (tokens: string) => boolean;
2289
+ push: (tokens: string, signal: _angular_core.Signal<unknown>) => void;
2290
+ pushMany: (map: Record<string, _angular_core.Signal<unknown>>) => void;
2291
+ };
2292
+ id: string;
2293
+ elementRef: _angular_core.ElementRef<HTMLElement>;
2294
+ };
2295
+ constructor();
2296
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PropsDirective, never>;
2297
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PropsDirective, "[etProps]", never, { "props": { "alias": "etProps"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
2298
+ }
2299
+
2300
+ type AnyTemplateType = string | TemplateRef<unknown> | ComponentType<unknown> | TemplateRefWithContext | ComponentTypeWithInputs;
2301
+ type TemplateRefWithContext<T = Record<string, unknown> | undefined, J = unknown> = {
2302
+ template: TemplateRef<J>;
2303
+ context?: T;
2304
+ injector?: Injector;
2305
+ };
2306
+ type ComponentTypeWithInputs<T = Record<string, unknown> | undefined, J = unknown> = {
2307
+ component: ComponentType<J>;
2308
+ inputs?: T;
2309
+ injector?: Injector;
2310
+ };
2311
+ type StringTemplate = {
2312
+ type: 'string';
2313
+ value: string;
2314
+ };
2315
+ type NgTemplateTemplate = {
2316
+ type: 'template';
2317
+ value: TemplateRef<unknown>;
2318
+ context?: Record<string, unknown>;
2319
+ injector: Injector | null;
2320
+ };
2321
+ type ComponentTemplate = {
2322
+ type: 'component';
2323
+ value: ComponentType<unknown>;
2324
+ inputs?: Record<string, unknown>;
2325
+ injector: Injector | null;
1480
2326
  };
2327
+ declare const templateComputed: (templateSignal: Signal<AnyTemplateType | null>) => Signal<StringTemplate | NgTemplateTemplate | ComponentTemplate | null>;
1481
2328
 
1482
- type SetupScrollRestorationConfig = {
2329
+ type ResizeEdge = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';
2330
+ type ResizeMoveEvent = {
2331
+ edge: ResizeEdge;
2332
+ /** Cumulative delta from the pointerdown position. */
2333
+ dx: number;
2334
+ dy: number;
2335
+ clientX: number;
2336
+ clientY: number;
2337
+ };
2338
+ declare class ResizeHandlesComponent {
2339
+ edges: _angular_core.InputSignal<ResizeEdge[]>;
2340
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
2341
+ private gestureStart$;
2342
+ private gesture$;
2343
+ resizeStarted: _angular_core.OutputRef<ResizeEdge>;
2344
+ resizeMoved: _angular_core.OutputRef<ResizeMoveEvent>;
2345
+ resizeEnded: _angular_core.OutputRef<void>;
2346
+ isResizing: _angular_core.Signal<boolean>;
2347
+ activeEdge: _angular_core.Signal<ResizeEdge | null>;
2348
+ readonly edgeCursors: Record<ResizeEdge, string>;
2349
+ startResizeGesture(event: PointerEvent, edge: ResizeEdge): void;
2350
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ResizeHandlesComponent, never>;
2351
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ResizeHandlesComponent, "et-resize-handles", never, { "edges": { "alias": "edges"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "resizeStarted": "resizeStarted"; "resizeMoved": "resizeMoved"; "resizeEnded": "resizeEnded"; }, never, never, true, never>;
2352
+ }
2353
+
2354
+ declare const elementCanScroll: (element?: HTMLElement | null, direction?: "x" | "y") => boolean;
2355
+ type IsElementVisibleOptions = {
1483
2356
  /**
1484
- * The scrollable container.
1485
- * @default document.documentElement
2357
+ * The element to check if it is visible inside a container.
1486
2358
  */
1487
- scrollElement?: HTMLElement;
2359
+ element?: HTMLElement | null;
1488
2360
  /**
1489
- * A list of query params that should trigger a scroll to top.
1490
- * @default []
1491
- * @example ['page'] // will scroll to top when the page query param changes
2361
+ * The container to check if the element is visible inside.
2362
+ * If null or undefined, uses the viewport as the container.
2363
+ * @default null (viewport)
1492
2364
  */
1493
- queryParamTriggerList?: string[];
2365
+ container?: HTMLElement | null;
1494
2366
  /**
1495
- * Config for fragment scrolling.
2367
+ * The container's rect to check if the element is visible inside. Can be supplied to reduce the amount of DOM reads.
2368
+ * Only used when container is provided and not null.
2369
+ * @default container.getBoundingClientRect()
1496
2370
  */
1497
- fragment?: {
1498
- /**
1499
- * Enable fragment scrolling (scroll to element with id)
1500
- * @default false
1501
- */
1502
- enabled?: boolean;
1503
- /**
1504
- * Whether to use smooth scrolling or not.
1505
- * @default false
1506
- */
1507
- smooth?: boolean;
1508
- };
2371
+ containerRect?: DOMRect | null;
2372
+ /**
2373
+ * The element's rect. Can be supplied to reduce the amount of DOM reads.
2374
+ * @default element.getBoundingClientRect()
2375
+ */
2376
+ elementRect?: DOMRect | null;
1509
2377
  };
1510
- declare const ET_DISABLE_SCROLL_TOP: unique symbol;
1511
- declare const ET_DISABLE_SCROLL_TOP_AS_RETURN_ROUTE: unique symbol;
1512
- declare const ET_DISABLE_SCROLL_TOP_ON_PATH_PARAM_CHANGE: unique symbol;
1513
- type RouterDisableScrollTopConfig = {
2378
+ type CurrentElementVisibility = {
1514
2379
  /**
1515
- * Whether to disable scroll to top ONLY when navigating back to this route.
1516
- * @default false
2380
+ * Whether the element is visible in the inline direction.
1517
2381
  */
1518
- asReturnRoute?: boolean;
2382
+ inline: boolean;
1519
2383
  /**
1520
- * Whether to disable scroll to top when a path param changes.
1521
- * @default false
2384
+ * Whether the element is visible in the block direction.
1522
2385
  */
1523
- onPathParamChange?: boolean;
1524
- };
1525
- declare const routerDisableScrollTop: (config?: RouterDisableScrollTopConfig) => {
1526
- [ET_DISABLE_SCROLL_TOP_ON_PATH_PARAM_CHANGE]?: boolean | undefined;
1527
- [ET_DISABLE_SCROLL_TOP]: boolean;
1528
- } | {
1529
- [ET_DISABLE_SCROLL_TOP_ON_PATH_PARAM_CHANGE]?: boolean | undefined;
1530
- [ET_DISABLE_SCROLL_TOP_AS_RETURN_ROUTE]: boolean;
1531
- };
1532
- declare const setupScrollRestoration: (config?: SetupScrollRestorationConfig) => void;
1533
-
1534
- declare const signalIsRendered: () => _angular_core.Signal<boolean>;
1535
- declare const createIsRenderedSignal: () => {
1536
- state: _angular_core.WritableSignal<boolean>;
1537
- bind: () => _angular_core.EffectRef;
1538
- };
1539
- declare const createCanAnimateSignal: () => {
1540
- state: _angular_core.Signal<boolean>;
1541
- };
1542
-
1543
- type RouterState = {
1544
- data: Data;
1545
- pathParams: Params;
1546
- queryParams: Params;
1547
- title: string | null;
1548
- fragment: string | null;
1549
- };
1550
- declare const ET_PROPERTY_REMOVED: unique symbol;
1551
- type InjectUtilConfig = {
1552
- /** The injector to use for the injection. Must be provided if the function is not called from within a injection context. */
1553
- injector?: Injector;
1554
- };
1555
- type InjectUtilTransformConfig<In, Out> = {
2386
+ block: boolean;
1556
2387
  /**
1557
- * A transform function similar to the `transform` function in Angular input bindings.
1558
- * Can be used to transform the value before it is returned.
1559
- * E.g. transforming `"true"` to `true` for a boolean attribute.
2388
+ * The percentage of the element that is visible in the inline direction.
1560
2389
  */
1561
- transform?: (value: In) => Out;
2390
+ inlineIntersection: number;
2391
+ /**
2392
+ * The percentage of the element that is visible in the block direction.
2393
+ */
2394
+ blockIntersection: number;
2395
+ /**
2396
+ * Whether the element is intersecting the container.
2397
+ */
2398
+ isIntersecting: boolean;
2399
+ /**
2400
+ * The ratio of the element that is intersecting the container.
2401
+ */
2402
+ intersectionRatio: number;
2403
+ /**
2404
+ * The element that is being checked for visibility.
2405
+ */
2406
+ element: HTMLElement;
2407
+ /**
2408
+ * The container's rect used for the calculation.
2409
+ */
2410
+ containerRect: DOMRect;
2411
+ /**
2412
+ * The element's rect used for the calculation.
2413
+ */
2414
+ elementRect: DOMRect;
1562
2415
  };
1563
- declare const transformOrReturn: <In, Out>(src: Signal<In>, config?: InjectUtilTransformConfig<In, Out>) => Signal<Out>;
1564
- /** Inject the current router event */
1565
- declare const injectRouterEvent: () => Signal<Event$1>;
1566
- /**
1567
- * Signal that indicates whether the router has been initialized.
1568
- * The router is considered initialized once the first NavigationEnd event with an id different than -1 has been emitted.
1569
- */
1570
- declare const injectIsRouterInitialized: () => Signal<boolean>;
1571
- /**
1572
- * Inject the current url.
1573
- * The url includes query params as well as the fragment. Use `injectRoute` instead if you are not intrusted in those.
1574
- * @example "/my-page?query=1&param=true#fragment"
1575
- */
1576
- declare const injectUrl: () => Signal<string>;
1577
- /**
1578
- * Inject the current route
1579
- * @example "/my-page"
1580
- */
1581
- declare const injectRoute: () => Signal<string>;
1582
- /**
1583
- * Inject the complete router state. This includes the current route data, path params, query params, title and fragment.
1584
- */
1585
- declare const injectRouterState: () => Signal<RouterState>;
1586
- /** Inject a signal containing the current route fragment (the part after the # inside the url if present) */
1587
- declare const injectFragment: <T = string | null>(config?: InjectUtilConfig & InjectUtilTransformConfig<string | null, T>) => Signal<T>;
1588
- /** Inject all currently available query parameters as a signal */
1589
- declare const injectQueryParams: () => Signal<Params>;
1590
- /** Inject all currently available route data as a signal */
1591
- declare const injectRouteData: () => Signal<Data>;
1592
- /** Inject the current route title as a signal */
1593
- declare const injectRouteTitle: <T = string | null>(config?: InjectUtilTransformConfig<string | null, T>) => Signal<T>;
1594
- /** Inject all currently available path parameters as a signal */
1595
- declare const injectPathParams: () => Signal<Params>;
1596
- type InjectQueryParamConfig<T> = InjectUtilTransformConfig<string | null, T> & {
2416
+ declare const isElementVisible: (options: IsElementVisibleOptions) => CurrentElementVisibility | null;
2417
+ declare const getElementScrollCoordinates: (options: ScrollToElementOptions) => ScrollToOptions;
2418
+ type ScrollToElementOptions = {
1597
2419
  /**
1598
- * If true, the initial value will be read from the browser's url.
1599
- * Note that this will not work with arrays or complex objects.
2420
+ * The element to scroll to.
1600
2421
  */
1601
- requireSync?: boolean;
2422
+ element?: HTMLElement | null;
2423
+ /**
2424
+ * The scroll container to scroll to the element in.
2425
+ * Must be provided - cannot scroll the viewport programmatically with this function.
2426
+ */
2427
+ container?: HTMLElement | null;
2428
+ /**
2429
+ * The direction to scroll in.
2430
+ * @default 'both'
2431
+ */
2432
+ direction?: 'inline' | 'block' | 'both';
2433
+ /**
2434
+ * The origin of the element to scroll to.
2435
+ * @default 'nearest'
2436
+ */
2437
+ origin?: 'start' | 'end' | 'center' | 'nearest';
2438
+ /**
2439
+ * The scroll behavior.
2440
+ * @default 'smooth'
2441
+ */
2442
+ behavior?: ScrollBehavior;
2443
+ /**
2444
+ * The scroll inline-margin
2445
+ * @default 0
2446
+ */
2447
+ scrollInlineMargin?: number;
2448
+ /**
2449
+ * The scroll block-margin
2450
+ * @default 0
2451
+ */
2452
+ scrollBlockMargin?: number;
1602
2453
  };
1603
- /** Inject a specific query parameter as a signal */
1604
- declare const injectQueryParam: <T = string | null>(key: string, config?: InjectQueryParamConfig<T>) => Signal<T>;
1605
- /** Inject a specific route data item as a signal */
1606
- declare const injectRouteDataItem: <T = unknown>(key: string, config?: InjectUtilTransformConfig<unknown, T>) => Signal<T>;
1607
- /** Inject a specific path parameter as a signal */
1608
- declare const injectPathParam: <T = string | null>(key: string, config?: InjectUtilTransformConfig<string | null, T>) => Signal<T>;
1609
- /**
1610
- * Inject query params that changed during navigation. Unchanged query params will be ignored.
1611
- * Removed query params will be represented by the symbol `ET_PROPERTY_REMOVED`.
1612
- */
1613
- declare const injectQueryParamChanges: () => Signal<Record<string, unknown>>;
1614
- /**
1615
- * Inject path params that changed during navigation. Unchanged path params will be ignored.
1616
- * Removed path params will be represented by the symbol `ET_PROPERTY_REMOVED`.
1617
- */
1618
- declare const injectPathParamChanges: () => Signal<Record<string, unknown>>;
2454
+ declare const scrollToElement: (options: ScrollToElementOptions) => void;
2455
+
2456
+ type ScrollSnapOrigin = 'auto' | 'start' | 'center' | 'end';
2457
+ type ScrollSnapTarget = {
2458
+ /** The element to snap to. */
2459
+ element: HTMLElement;
2460
+ /** The resolved alignment to use when scrolling to the element. */
2461
+ origin: 'start' | 'center' | 'end';
2462
+ } | null;
2463
+ declare const getScrollSnapTarget: (items: HTMLElement[], container: HTMLElement, direction: "horizontal" | "vertical", origin: ScrollSnapOrigin, margin?: number) => ScrollSnapTarget;
2464
+ type ScrollContainerTarget = {
2465
+ element: HTMLElement;
2466
+ origin: 'start' | 'end';
2467
+ } | null;
2468
+ declare const getScrollContainerTarget: (entries: IntersectionObserverEntry[], direction: "start" | "end") => ScrollContainerTarget;
2469
+ type ScrollItemTarget = {
2470
+ element: HTMLElement;
2471
+ index: number;
2472
+ origin: 'start' | 'end' | 'center';
2473
+ } | null;
2474
+ declare const getScrollItemTarget: (entries: IntersectionObserverEntry[], container: HTMLElement, direction: "start" | "end", scrollOrigin: "auto" | "center" | "start" | "end", axisDirection: "horizontal" | "vertical") => ScrollItemTarget;
1619
2475
 
1620
2476
  type HeadBinding<T> = {
1621
2477
  id: symbol;
@@ -2163,5 +3019,97 @@ declare const injectTitleStore: {
2163
3019
  };
2164
3020
  declare const applyHeadTitleBinding: (binding: MaybeSignal<string | number | null | undefined>, options?: Omit<TitlePart, "text">) => void;
2165
3021
 
2166
- export { ANIMATABLE_TOKEN, ANIMATED_IF_TOKEN, ANIMATED_LIFECYCLE_TOKEN, AT_LEAST_ONE_REQUIRED, AnimatableDirective, AnimatedIfDirective, AnimatedLifecycleDirective, AnimatedOverlayDirective, BOUNDARY_ELEMENT_TOKEN, ClickOutsideDirective, DEFAULT_MULTI_INSTANCE_RELS, DEFAULT_MULTI_INSTANCE_TAGS, DEFAULT_VIEWPORT_CONFIG, DISABLE_LOGGER_PARAM, ET_DISABLE_SCROLL_TOP, ET_DISABLE_SCROLL_TOP_AS_RETURN_ROUTE, ET_DISABLE_SCROLL_TOP_ON_PATH_PARAM_CHANGE, ET_PROPERTY_REMOVED, FOCUS_VISIBLE_TRACKER_TOKEN, IS_ARRAY_NOT_EMPTY, IS_EMAIL, InferMimeTypePipe, IsArrayNotEmpty, IsEmail, jsonLd_d as JsonLD, KeyPressManager, MUST_MATCH, MatchStateType, MustMatch, NormalizeGameResultTypePipe, NormalizeMatchParticipantsPipe, NormalizeMatchScorePipe, NormalizeMatchStatePipe, NormalizeMatchTypePipe, PropsDirective, ProvideThemeDirective, RUNTIME_ERROR_NO_DATA, RepeatDirective, RuntimeError, SEO_DIRECTIVE_TOKEN, SeoDirective, StructuredDataComponent, THEME_PROVIDER, ToArrayPipe, TypedQueryList, ValidateAtLeastOneRequired, Validators, applyAlternateBinding, applyAlternateLanguagesBindings, applyArticleBindings, applyAuthorBinding, applyCanonicalBinding, applyDescriptionBinding, applyHeadBinding, applyHeadTitleBinding, applyHostListener, applyHostListeners, applyKeywordsBinding, applyLinkBinding, applyMetaBinding, applyNextBinding, applyOgBinding, applyOpenGraphBindings, applyPrevBinding, applyResourceHintsBindings, applyRobotsBinding, applySocialMediaBindings, applyStructuredDataBinding, applyTwitterCardBindings, areScrollStatesEqual, bindProps, boundingClientRectToElementRect, buildElementSignal, buildSignalEffects, clamp, clone, cloneFormGroup, computedTillFalsy, computedTillTruthy, controlValueSignal, controlValueSignalWithPrevious, createArrayPropertyBinding, createBulkPropertyBinding, createCanAnimateSignal, createComponentId, createCssThemeName, createDependencyStash, createDestroy, createDocumentElementSignal, createElementDictionary, createElementDimensions, createEmptyElementSignal, createFlipAnimation, createFlipAnimationGroup, createHostProps, createIsRenderedSignal, createLogger, createPropHandlers, createPropertyBinding, createProps, createProvider, createRootProvider, createRootThemeCss, createRxHostListener, createSetup, createStaticProvider, createStaticRootProvider, createSwatchCss, createTailwindColorThemes, createTailwindCssVar, createTailwindRgbVar, createThemeStyle, deferredSignal, deleteCookie, easeElastic, easeIn, easeInOut, easeLinear, easeOut, easeOutBack, easeOutBackStrong, elementCanScroll, equal, firstElementSignal, forceReflow, formatRuntimeError, fromNextFrame, getCookie, getDomain, getElementScrollCoordinates, getFormGroupValue, getGroupMatchPoints, getGroupMatchScore, getKnockoutMatchScore, getMatchScoreSubLine, getObjectProperty, hasCookie, inferMimeType, injectAngularRootElement, injectBoundaryElement, injectBreakpointIsMatched, injectBreakpointObserver, injectCanHover, injectColorThemes, injectCurrentBreakpoint, injectDeviceInputType, injectDisplayOrientation, injectFocusVisibleTracker, injectFragment, injectHasPrecisionInput, injectHasTouchInput, injectHostElement, injectIs2Xl, injectIsLandscape, injectIsLg, injectIsMd, injectIsPortrait, injectIsRouterInitialized, injectIsSm, injectIsXl, injectIsXs, injectLinkStore, injectLinkStoreConfig, injectLocale, injectMediaQueryIsMatched, injectMetaConfig, injectMetaStore, injectObserveBreakpoint, injectObserveMediaQuery, injectPathParam, injectPathParamChanges, injectPathParams, injectQueryParam, injectQueryParamChanges, injectQueryParams, injectRenderer, injectRoute, injectRouteData, injectRouteDataItem, injectRouteTitle, injectRouterEvent, injectRouterState, injectScrollbarDimensions, injectStructuredDataConfig, injectStructuredDataStore, injectTemplateRef, injectThemesPrefix, injectTitleConfig, injectTitleStore, injectUrl, injectViewportConfig, injectViewportDimensions, isArray, isElementSignal, isElementVisible, isGroupMatch, isKnockoutMatch, isObject, maybeSignalValue, memoizeSignal, nextFrame, normalizeGameResultType, normalizeMatchParticipant, normalizeMatchParticipants, normalizeMatchScore, normalizeMatchState, normalizeMatchType, previousSignalValue, provideBoundaryElement, provideBreakpointObserver, provideColorThemes, provideColorThemesWithTailwind4, provideFocusVisibleTracker, provideLinkStore, provideLinkStoreConfig, provideLocale, provideMetaConfig, provideMetaStore, provideRenderer, provideStructuredDataConfig, provideStructuredDataStore, provideTitleConfig, provideTitleStore, provideViewportConfig, round, routerDisableScrollTop, scrollToElement, setCookie, setInputSignal, 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, unbindProps, useCursorDragScroll, writeScrollbarSizeToCssVariables, writeViewportSizeToCssVariables, ɵProvideColorThemes, ɵProvideThemesPrefix };
2167
- export type { AlternateLanguagesConfig, AlternateLink, AngularRenderer, AnimatedLifecycleState, AnimatedNumberSignal, AnimatedOverlayComponentBase, AnimatedOverlayMountConfig, AnimatedOverlayState, AnimationEndEvent, AnyTemplateType, ArticleConfig, BindPropsOptions, Breakpoint, BuildMediaQueryOptions, BuildSignalEffectsConfig, ComponentTemplate, ComponentTypeWithInputs, ControlValueSignalOptions, CreateLoggerConfig, CreatePropsOptions, CreateProviderOptions, CurrentElementVisibility, CursorDragScrollDirection, CursorDragScrollOptions, ElementDimensions, ElementLastScrollDirection, ElementLastScrollDirectionType, ElementRect, ElementScrollState, ElementSignal, ElementSignalValue, ElementSize, FacebookCard, FlipAnimationConfig, HeadBinding, HostProps, InjectQueryParamConfig, InjectUtilConfig, InjectUtilTransformConfig, IntersectionObserverEntryWithDetails, IsElementVisibleOptions, LinkConfig, LinkStoreConfig, LogicalSize, MaybeObservable, MaybeSignal, MetaConfig, MetaTagConfig, NgClassType, NgTemplateTemplate, NormalizedGameResultType, NormalizedMatchParticipant, NormalizedMatchParticipants, NormalizedMatchScore, NullableElementDimensions, OnThemeColorMap, OpenGraph, OpenGraphConfig, PropHandlers, Props, PropsAttachedElements, PropsAttachedElementsInternal, PropsInternal, ProviderResult, ResourceHintsConfig, RobotsConfig, RootProviderResult, RouterDisableScrollTopConfig, RouterState, ScrollToElementOptions, SeoConfig, SetupScrollRestorationConfig, SignalAnimatedNumberOptions, SignalElementBindingComplexType, SignalElementBindingType, SignalElementIntersectionOptions, SignalElementScrollStateOptions, SocialMediaConfig, StaticProviderResult, StringTemplate, StructuredDataConfig, SyncSignalOptions, TemplateRefWithContext, Theme, ThemeColor, ThemeColorMap, ThemeHSLColor, ThemeRGBColor, ThemeSwatch, TitleConfig, TitlePart, Translatable, TwitterCard, TwitterCardConfig, UnbindPropsOptions, ValidateAtLeastOneRequiredConfig, Vec2, ViewportConfig };
3022
+ /**
3023
+ * The value source an unsaved-changes tracker watches. In order of preference:
3024
+ *
3025
+ * - **`FieldTree<T>`** (signal forms — primary): read `field().value()`, restore `field().value.set(v)`.
3026
+ * - **`Signal<FieldTree<T> | null>`**: a late/async-created signal form — resolves once the field exists.
3027
+ * - **`AbstractControl`** (reactive forms — migration path): bridged via `controlValueSignal` + `setValue`.
3028
+ * - **`WritableSignal<T>`** (escape hatch for non-form state): read/write directly.
3029
+ */
3030
+ type UnsavedChangesSource<T> = FieldTree<T> | Signal<FieldTree<T> | null> | AbstractControl | WritableSignal<T>;
3031
+ /** A value source reduced to a read signal plus a writer, regardless of its original kind. */
3032
+ type NormalizedUnsavedChangesSource<T> = {
3033
+ /** The current value. `null` while a late/async source has not produced a value yet. */
3034
+ value: Signal<T | null>;
3035
+ /** Writes a value back to the source (used by `restoreDefaultValue`). No-op if the source isn't ready. */
3036
+ setValue: (value: T) => void;
3037
+ };
3038
+ /** Reduces any {@link UnsavedChangesSource} to a uniform read-signal + writer pair. */
3039
+ declare const normalizeUnsavedChangesSource: <T>(source: UnsavedChangesSource<T>) => NormalizedUnsavedChangesSource<T>;
3040
+
3041
+ /**
3042
+ * Decides whether a value with unsaved changes may be discarded. Called with the current value when
3043
+ * (and only when) changes exist. Return a truthy value / resolved Promise / emitted Observable value
3044
+ * to allow the discard, falsy to keep the changes. Typically opens a confirm dialog.
3045
+ */
3046
+ type UnsavedChangesConfirmFn<T> = (value: T) => boolean | Promise<boolean> | Observable<boolean> | unknown;
3047
+ type CreateUnsavedChangesTrackerConfig<T> = {
3048
+ /** The form / value to watch. See {@link UnsavedChangesSource}. */
3049
+ source: UnsavedChangesSource<T>;
3050
+ /**
3051
+ * The baseline the current value is compared against.
3052
+ * If omitted, the first non-null value the source produces is captured automatically (so
3053
+ * async-filled forms work without wiring). A function is evaluated once, eagerly.
3054
+ */
3055
+ defaultValue?: T | (() => T);
3056
+ /**
3057
+ * Required, per call site. Runs only when there are changes to discard.
3058
+ * @see UnsavedChangesConfirmFn
3059
+ */
3060
+ confirm: UnsavedChangesConfirmFn<T>;
3061
+ /**
3062
+ * Custom equality between the current value and the default. Deep-equal by default.
3063
+ *
3064
+ * Note: this is snapshot-vs-default comparison, deliberately **not** signal-forms' `dirty()`
3065
+ * (which means "was edited", so typing then deleting stays dirty — here it's clean again).
3066
+ */
3067
+ compareFn?: (current: T, defaultValue: T) => boolean;
3068
+ };
3069
+ type UnsavedChangesTrackerRef<T> = {
3070
+ /** Whether the current value differs from the default. */
3071
+ hasChanges: Signal<boolean>;
3072
+ /** The current baseline. `null` until a value (or explicit default) exists. */
3073
+ defaultValue: Signal<T | null>;
3074
+ /**
3075
+ * Resolves `true` if there are no changes or the user confirmed the discard, `false` otherwise.
3076
+ * Normalizes the `confirm` return (value / Promise / Observable) to a `Promise<boolean>`.
3077
+ */
3078
+ runCheck: () => Promise<boolean>;
3079
+ /** Re-baseline to the current value — e.g. after a save that keeps the form open. */
3080
+ refreshDefaultValue: () => void;
3081
+ /** Write the default back onto the source (revert edits). No-op if there is no default yet. */
3082
+ restoreDefaultValue: () => void;
3083
+ };
3084
+ /**
3085
+ * The framework-agnostic core of the unsaved-changes family: snapshots a default value, tracks
3086
+ * whether the watched form/value differs from it, and runs an async confirm before a discard.
3087
+ * Call from an injection context (a field initializer or constructor).
3088
+ *
3089
+ * Overlay and router flavors (`createOverlayUnsavedChangesGuard`, `createUnsavedChangesGuard`) build
3090
+ * on this — use them when you want the guard wired to a close/navigation event automatically.
3091
+ */
3092
+ declare const createUnsavedChangesTracker: <T>(config: CreateUnsavedChangesTrackerConfig<T>) => UnsavedChangesTrackerRef<T>;
3093
+
3094
+ type CreateUnsavedChangesGuardConfig<T> = CreateUnsavedChangesTrackerConfig<T>;
3095
+ type UnsavedChangesGuardRef<T> = UnsavedChangesTrackerRef<T> & {
3096
+ /**
3097
+ * A `CanDeactivateFn`-compatible check: resolves `true` when the route may be left (no changes, or
3098
+ * the user confirmed the discard), `false` to stay. Wire it into a route's `canDeactivate`.
3099
+ *
3100
+ * ```ts
3101
+ * export const editGuard: CanDeactivateFn<EditComponent> = (component) => component.guard.canDeactivate();
3102
+ * ```
3103
+ */
3104
+ canDeactivate: () => Promise<boolean>;
3105
+ };
3106
+ /**
3107
+ * The router / manual flavor of the unsaved-changes family: a {@link createUnsavedChangesTracker}
3108
+ * plus a `canDeactivate` bridge for Angular route guards. It touches no overlay APIs, so it also
3109
+ * serves as a standalone "does this form have unsaved changes, and may I discard them?" helper.
3110
+ * Call from an injection context.
3111
+ */
3112
+ declare const createUnsavedChangesGuard: <T>(config: CreateUnsavedChangesGuardConfig<T>) => UnsavedChangesGuardRef<T>;
3113
+
3114
+ export { ANIMATABLE_TOKEN, ANIMATED_IF_TOKEN, ANIMATED_LIFECYCLE_TOKEN, ANIMATION_DEBUG_STORAGE_KEY, AT_LEAST_ONE_REQUIRED, AnimatableDirective, AnimatedIfDirective, AnimatedLifecycleDirective, AnimatedOverlayDirective, AutoSurfaceDirective, 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, InitialsPipe, IsArrayNotEmpty, IsEmail, jsonLd_d as JsonLD, KeyPressManager, MUST_MATCH, MarkdownToHtmlPipe, MatchStateType, 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, SlugifyPipe, 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, copyToClipboard, 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, createRoute, createRouterState, createRxHostListener, createSessionMemory, createSetup, createStaticProvider, createStaticRootProvider, createSwatchCss, createSwipeTracker, createTailwindColorThemes, createTailwindCssVar, createTailwindRgbVar, createThemeStyle, createUnsavedChangesGuard, createUnsavedChangesTracker, 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, initials, injectAngularRootElement, injectAnimatedBlockSize, 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, injectPrefersReducedMotion, 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, normalizeUnsavedChangesSource, numberBreakpointAttribute, numberBreakpointTransform, previousSignalValue, provideBoundaryElement, provideBreakpointInstance, provideBreakpointObserver, provideColorThemes, provideColorThemesWithTailwind4, provideFocusVisibleTracker, provideLinkStore, provideLinkStoreConfig, provideLocale, provideMetaConfig, provideMetaStore, provideOverlayRuntime, provideRenderer, provideStructuredDataConfig, provideStructuredDataStore, provideStyleManager, provideSurfaceContextTracker, provideSurfaceThemesWithTailwind4, provideTitleConfig, provideTitleStore, provideViewportConfig, randomId, readFromClipboard, resetPositioningStyles, resolveAppRootColorProvider, 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, slugify, switchQueryListChanges, syncSignal, templateComputed, toArray, toArrayTrackByFn, toStringBinding, transformOrReturn, typedBreakpointTransform, unbindProps, useCursorDragScroll, writeScrollbarSizeToCssVariables, writeViewportSizeToCssVariables, ɵProvideColorThemes, ɵProvideColorThemesPrefix, ɵProvideSurfaceThemes, ɵProvideSurfaceThemesPrefix };
3115
+ export type { AlternateLanguagesConfig, AlternateLink, AngularRenderer, AnimatedBlockSizeConfig, AnimatedLifecycleState, AnimatedNumberSignal, AnimatedOverlayComponentBase, AnimatedOverlayMountConfig, AnimatedOverlayState, AnimatedSizeAxis, AnimationEndEvent, AnyTemplateType, ArticleConfig, BindPropsOptions, BoolBreakpointSignal, Breakpoint, BreakpointInput, BreakpointMap, BuildMediaQueryOptions, BuildSignalEffectsConfig, ColorTheme, ColorThemeType, ComponentTemplate, ComponentTypeWithInputs, ConsentHandler, ControlValueSignalOptions, CreateLoggerConfig, CreatePropsOptions, CreateProviderOptions, CreateSessionMemoryConfig, CreateUnsavedChangesGuardConfig, CreateUnsavedChangesTrackerConfig, CreateUserConsentProviderOptions, CurrentElementVisibility, CursorDragScrollDirection, CursorDragScrollOptions, DragMoveEvent, DragStartEvent, ElementDimensions, ElementLastScrollDirection, ElementLastScrollDirectionType, ElementRect, ElementScrollState, ElementSignal, ElementSignalValue, ElementSize, EthleteColorThemeNameRegistry, EthleteSurfaceThemeNameRegistry, FacebookCard, FlipAnimationConfig, HeadBinding, HostProps, InjectQueryParamConfig, InjectUtilConfig, InjectUtilTransformConfig, IntersectionObserverEntryWithDetails, IsElementVisibleOptions, LinkConfig, LinkStoreConfig, LogicalSize, MaybeObservable, MaybeSignal, MetaConfig, MetaTagConfig, NgClassType, NgTemplateTemplate, NormalizedGameResultType, NormalizedMatchParticipant, NormalizedMatchParticipants, NormalizedMatchScore, NormalizedUnsavedChangesSource, NullableElementDimensions, NumberBreakpointSignal, OnThemeColorMap, OpenGraph, OpenGraphConfig, OverlayRuntimeAnchoredPosition, OverlayRuntimeAnimationDelegate, OverlayRuntimeAnimationDelegateEnterContext, OverlayRuntimeAnimationDelegateLeaveContext, OverlayRuntimeAutoFocusTarget, OverlayRuntimeCenteredPosition, OverlayRuntimeCloseEvent, OverlayRuntimeCloseGuard, OverlayRuntimeCloseSource, OverlayRuntimeComponentBase, OverlayRuntimeElements, OverlayRuntimeGlobalPosition, OverlayRuntimeGlobalPositionAlignment, OverlayRuntimeMountConfig, OverlayRuntimePositionStrategy, OverlayRuntimeRef, OverlayRuntimeRole, OverlayRuntimeShiftOptions, OverlayRuntimeState, PropHandlers, Props, PropsAttachedElements, PropsAttachedElementsInternal, PropsInternal, ProviderResult, RegisteredColorThemeName, RegisteredSurfaceThemeName, ResizeEdge, ResizeMoveEvent, ResourceHintsConfig, RobotsConfig, RootProviderResult, RouterDisableScrollTopConfig, RouterState, ScrollContainerTarget, ScrollItemTarget, ScrollSnapOrigin, ScrollSnapTarget, ScrollToElementOptions, SeoConfig, SetupScrollRestorationConfig, SignalAnimatedNumberOptions, SignalElementBindingComplexType, SignalElementBindingType, SignalElementIntersectionOptions, SignalElementScrollStateOptions, SocialMediaConfig, StaticProviderResult, StringTemplate, StructuredDataConfig, StyleManager, SurfaceContextEntry, SurfaceContextTracker, SurfaceInteractionColor, SurfaceTheme, SurfaceThemeColor, SurfaceType, SwipeEndEvent, SwipeTracker, SwipeUpdateEvent, SyncSignalOptions, TemplateRefWithContext, ThemeColor, ThemeColorMap, ThemeHSLColor, ThemeInkColorMap, ThemeRGBColor, ThemeSwatch, TitleConfig, TitlePart, Translatable, TwitterCard, TwitterCardConfig, TypedBreakpointSignal, UnbindPropsOptions, UnsavedChangesConfirmFn, UnsavedChangesGuardRef, UnsavedChangesSource, UnsavedChangesTrackerRef, ValidateAtLeastOneRequiredConfig, Vec2, ViewportConfig };