@ethlete/core 5.0.0-next.65 → 5.0.0-next.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # @ethlete/core
2
2
 
3
+ ## 5.0.0-next.66
4
+
5
+ ### Minor Changes
6
+
7
+ - `injectRouterState()` now carries the navigation `id` and `trigger` (`'imperative' | 'popstate' | 'hashchange'`).
8
+ - Scroll restoration can restore page state, such as a paged list's page count, before it applies the offset (`registerScrollRestorationState`), and can restore after a reload (`restore.restoreOnReload`).
9
+
10
+ ### Patch Changes
11
+
12
+ - `injectIsRouterInitialized()` is now `true` only once the first navigation has ended, so a component created during it sees `false`.
13
+
3
14
  ## 5.0.0-next.65
4
15
 
5
16
  ### Minor Changes
@@ -1,11 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { assertInInjectionContext, inject, DestroyRef, ElementRef, TemplateRef, InjectionToken, booleanAttribute, QueryList, RendererFactory2, RendererStyleFlags2, isSignal, DOCUMENT, signal, linkedSignal, isDevMode, computed, afterNextRender, effect, untracked, ApplicationRef, runInInjectionContext, NgZone, Injector, numberAttribute, PLATFORM_ID, afterRenderEffect, EnvironmentInjector, createComponent, ViewEncapsulation, Component, Directive, model, ViewContainerRef, input, CSP_NONCE, provideEnvironmentInitializer, output, createEnvironmentInjector, Pipe, makeEnvironmentProviders, afterEveryRender } from '@angular/core';
3
3
  import { takeUntilDestroyed, toSignal, toObservable, outputFromObservable } from '@angular/core/rxjs-interop';
4
- import { Subject, fromEvent, switchMap, startWith, of, defer, from, map, catchError, timer, takeUntil, tap, pairwise, debounceTime, merge, distinctUntilChanged, EMPTY, expand, skip, take, filter, BehaviorSubject, combineLatest, Observable, isObservable, firstValueFrom, defaultIfEmpty, concatMap, concat, finalize, exhaustMap, share, shareReplay, ReplaySubject } from 'rxjs';
4
+ import { Subject, fromEvent, switchMap, startWith, of, defer, from, map, catchError, timer, takeUntil, tap, pairwise, debounceTime, merge, distinctUntilChanged, EMPTY, expand, skip, take, filter, isObservable, ignoreElements, BehaviorSubject, combineLatest, Observable, firstValueFrom, defaultIfEmpty, concatMap, concat, finalize, exhaustMap, share, shareReplay, ReplaySubject } from 'rxjs';
5
5
  import { FormGroup, FormArray, FormControl } from '@angular/forms';
6
6
  import { SIGNAL, signalSetFn } from '@angular/core/primitives/signals';
7
7
  import { isPlatformBrowser, Location, DOCUMENT as DOCUMENT$1, isPlatformServer } from '@angular/common';
8
- import { Router, NavigationEnd, NavigationSkipped, NavigationStart, NavigationError, RouterLink } from '@angular/router';
8
+ import { Router, NavigationEnd, NavigationCancel, NavigationError, NavigationSkipped, NavigationStart, RouterLink } from '@angular/router';
9
9
  import { Title, Meta, DomSanitizer } from '@angular/platform-browser';
10
10
  import { platform, offset, flip, shift, limitShift, computePosition, autoUpdate, hide, arrow, size } from '@floating-ui/dom';
11
11
 
@@ -2980,16 +2980,17 @@ const injectRouterEvent = /* @__PURE__ */ memoizeSignal(() => {
2980
2980
  });
2981
2981
  /**
2982
2982
  * Signal that indicates whether the router has been initialized.
2983
- * The router is considered initialized once its first navigation has completed, including one that completed
2984
- * before this signal was first injected.
2983
+ * It turns true once the first navigation has ended (completed, was cancelled, failed or was skipped), so a
2984
+ * component created while the first navigation runs still sees `false`. Injected after that point, it is `true`
2985
+ * right away.
2985
2986
  */
2986
2987
  const injectIsRouterInitialized = /* @__PURE__ */ memoizeSignal(() => {
2987
- const event = injectRouterEvent();
2988
- const navigatedBefore = inject(Router).navigated;
2989
- return computed(() => {
2990
- const e = event();
2991
- return navigatedBefore || (e instanceof NavigationEnd && e.id !== -1) || e instanceof NavigationSkipped;
2992
- });
2988
+ const router = inject(Router);
2989
+ const firstNavigationRunning = router.currentNavigation()?.id === 1;
2990
+ return toSignal(router.events.pipe(filter((e) => e instanceof NavigationEnd ||
2991
+ e instanceof NavigationCancel ||
2992
+ e instanceof NavigationError ||
2993
+ e instanceof NavigationSkipped), map(() => true)), { initialValue: router.navigated && !firstNavigationRunning });
2993
2994
  });
2994
2995
  /**
2995
2996
  * Inject the current url.
@@ -3042,12 +3043,15 @@ const createRouterState = (router) => {
3042
3043
  route = route.firstChild;
3043
3044
  }
3044
3045
  const { data, params, queryParams, title, fragment } = route;
3046
+ const navigation = router.currentNavigation();
3045
3047
  return {
3046
3048
  data,
3047
3049
  pathParams: params,
3048
3050
  queryParams,
3049
3051
  title: title ?? null,
3050
3052
  fragment,
3053
+ id: navigation?.id ?? null,
3054
+ trigger: navigation?.trigger ?? null,
3051
3055
  };
3052
3056
  };
3053
3057
  /**
@@ -3069,14 +3073,20 @@ const readUncommittedUrl = (router, location) => {
3069
3073
  : window.location.pathname + window.location.search + window.location.hash;
3070
3074
  };
3071
3075
  /**
3072
- * Inject the complete router state. This includes the current route data, path params, query params, title and fragment.
3076
+ * Inject the complete router state. This includes the current route data, path params, query params, title and fragment,
3077
+ * plus the `id` and `trigger` of the current navigation (the last one once it has ended).
3073
3078
  */
3074
3079
  const injectRouterState = /* @__PURE__ */ memoizeSignal(() => {
3075
3080
  const event = injectRouterEvent();
3076
3081
  const router = inject(Router);
3082
+ const lastStart = toSignal(router.events.pipe(filter((e) => e instanceof NavigationStart), map((e) => ({ id: e.id, trigger: e.navigationTrigger ?? null }))), { initialValue: null });
3077
3083
  return computed(() => {
3078
3084
  event();
3079
- return createRouterState(router);
3085
+ const state = createRouterState(router);
3086
+ if (state.id !== null)
3087
+ return state;
3088
+ const start = lastStart();
3089
+ return { ...state, id: start?.id ?? null, trigger: start?.trigger ?? null };
3080
3090
  }, { equal });
3081
3091
  });
3082
3092
  /** Inject a signal containing the current route fragment (the part after the # inside the url if present) */
@@ -3264,7 +3274,32 @@ const ET_RESTORE_SCROLL = /* @__PURE__ */ Symbol('ET_RESTORE_SCROLL');
3264
3274
  const routerRestoreScroll = () => ({ [ET_RESTORE_SCROLL]: true });
3265
3275
  const SCROLL_RESTORATION_HOLDS_DEF = /* @__PURE__ */ defineRootProvider(() => {
3266
3276
  const holds = new Set();
3277
+ const states = new Set();
3267
3278
  return {
3279
+ addState: (state) => {
3280
+ states.add(state);
3281
+ return () => states.delete(state);
3282
+ },
3283
+ saveStates: () => {
3284
+ if (!states.size)
3285
+ return undefined;
3286
+ const values = {};
3287
+ for (const state of states) {
3288
+ values[state.key] = state.save();
3289
+ }
3290
+ return values;
3291
+ },
3292
+ restoreStates: (values) => {
3293
+ const pending = [];
3294
+ for (const state of states) {
3295
+ if (!(state.key in values))
3296
+ continue;
3297
+ const result = state.restore(values[state.key]);
3298
+ if (isObservable(result))
3299
+ pending.push(result);
3300
+ }
3301
+ return pending;
3302
+ },
3268
3303
  add: (isPending) => {
3269
3304
  holds.add(isPending);
3270
3305
  return () => holds.delete(isPending);
@@ -3299,12 +3334,55 @@ const holdScrollRestoration = (isPending) => {
3299
3334
  const remove = injectScrollRestorationHolds().add(isPending);
3300
3335
  inject(DestroyRef).onDestroy(remove);
3301
3336
  };
3337
+ /**
3338
+ * Remember a piece of page state with the scroll entry, and restore it before the offset is applied -
3339
+ * the number of loaded pages of a paged list, for instance, without which the saved offset points at
3340
+ * the wrong items. Registers for the lifetime of the current injection context.
3341
+ *
3342
+ * Needs `restore.enabled` on {@link setupScrollRestoration}.
3343
+ *
3344
+ * @example
3345
+ * // inside a route component
3346
+ * registerScrollRestorationState({
3347
+ * key: 'pages',
3348
+ * save: () => pageCount(),
3349
+ * restore: (count) => loadPages$(count),
3350
+ * });
3351
+ */
3352
+ const registerScrollRestorationState = (config) => {
3353
+ const remove = injectScrollRestorationHolds().addState(config);
3354
+ inject(DestroyRef).onDestroy(remove);
3355
+ };
3302
3356
  /** Upper bound on remembered history entries. Each entry is a single number, so this is generous. */
3303
3357
  const MAX_STORED_POSITIONS = 200;
3304
3358
  const DEFAULT_RESTORE_TIMEOUT = 1000;
3305
3359
  const DEFAULT_RESTORE_MAX_TIMEOUT = 10_000;
3306
3360
  /** Events that mean the user took over scrolling, so a pending restoration must be abandoned. */
3307
3361
  const INTERACTION_EVENTS = ['wheel', 'touchmove', 'keydown'];
3362
+ const RELOAD_STORAGE_KEY = 'et-scroll-restoration';
3363
+ const readReloadEntry = () => {
3364
+ try {
3365
+ const raw = sessionStorage.getItem(RELOAD_STORAGE_KEY);
3366
+ sessionStorage.removeItem(RELOAD_STORAGE_KEY);
3367
+ const entry = raw ? JSON.parse(raw) : null;
3368
+ return typeof entry?.top === 'number' && typeof entry.route === 'string' ? entry : null;
3369
+ }
3370
+ catch {
3371
+ return null;
3372
+ }
3373
+ };
3374
+ const writeReloadEntry = (entry) => {
3375
+ try {
3376
+ sessionStorage.setItem(RELOAD_STORAGE_KEY, JSON.stringify(entry));
3377
+ }
3378
+ catch {
3379
+ // Storage may be full or blocked (private mode); a reload then simply starts at the top.
3380
+ }
3381
+ };
3382
+ const isFreshNavigation = () => {
3383
+ const entry = performance.getEntriesByType?.('navigation')[0];
3384
+ return entry?.type === 'navigate';
3385
+ };
3308
3386
  /** Key order is navigation order, not declaration order, so two spellings of one URL compare equal. */
3309
3387
  const serializeQueryParams = (queryParams) => Object.keys(queryParams)
3310
3388
  .sort()
@@ -3334,6 +3412,8 @@ const setupScrollRestoration = (config = {}) => {
3334
3412
  const restoreTimeout = config.restore?.timeout ?? DEFAULT_RESTORE_TIMEOUT;
3335
3413
  const restoreMaxTimeout = config.restore?.maxTimeout ?? DEFAULT_RESTORE_MAX_TIMEOUT;
3336
3414
  const clampOnTimeout = config.restore?.clampOnTimeout ?? true;
3415
+ const restoreOnReload = restoreEnabled && config.restore?.restoreOnReload === true;
3416
+ let reloadEntry = restoreOnReload && !isFreshNavigation() ? readReloadEntry() : null;
3337
3417
  const resolveScrollElement = () => {
3338
3418
  const el = typeof config.scrollElement === 'function' ? config.scrollElement() : config.scrollElement;
3339
3419
  return el ?? document.documentElement;
@@ -3362,11 +3442,22 @@ const setupScrollRestoration = (config = {}) => {
3362
3442
  pendingRestore?.();
3363
3443
  pendingRestore = null;
3364
3444
  };
3365
- const scheduleRestore = (target) => {
3445
+ const captureEntry = () => ({
3446
+ top: resolveScrollElement().scrollTop,
3447
+ route: prev.route,
3448
+ search: serializeQueryParams(prev.state.queryParams),
3449
+ state: holds.saveStates(),
3450
+ });
3451
+ const scheduleRestore = (entry) => {
3366
3452
  cancelPendingRestore();
3453
+ const target = entry.top;
3367
3454
  let frame = 0;
3368
3455
  let started = false;
3369
3456
  let cancelled = false;
3457
+ let renderRef = null;
3458
+ let fallback;
3459
+ let stateSubscription = null;
3460
+ let stateDeadline;
3370
3461
  // The user scrolling always wins over a restoration we have not committed yet.
3371
3462
  const abortByUser = () => cancelPendingRestore();
3372
3463
  const hardDeadline = Date.now() + restoreMaxTimeout;
@@ -3406,8 +3497,14 @@ const setupScrollRestoration = (config = {}) => {
3406
3497
  started = true;
3407
3498
  frame = requestAnimationFrame(step);
3408
3499
  };
3409
- const renderRef = afterNextRender({ read: start }, { injector });
3410
- const fallback = setTimeout(start);
3500
+ const waitForRender = () => {
3501
+ if (cancelled)
3502
+ return;
3503
+ clearTimeout(stateDeadline);
3504
+ renderRef = afterNextRender({ read: start }, { injector });
3505
+ fallback = setTimeout(start);
3506
+ };
3507
+ const pendingStates = entry.state ? holds.restoreStates(entry.state) : [];
3411
3508
  for (const eventName of INTERACTION_EVENTS) {
3412
3509
  document.addEventListener(eventName, abortByUser, { capture: true, passive: true });
3413
3510
  }
@@ -3415,7 +3512,9 @@ const setupScrollRestoration = (config = {}) => {
3415
3512
  // `cancelled` is not redundant with destroying the render hook: a superseded restoration must
3416
3513
  // not apply its (now stale) offset even if its hook had already been queued to run.
3417
3514
  cancelled = true;
3418
- renderRef.destroy();
3515
+ renderRef?.destroy();
3516
+ stateSubscription?.unsubscribe();
3517
+ clearTimeout(stateDeadline);
3419
3518
  if (frame)
3420
3519
  cancelAnimationFrame(frame);
3421
3520
  clearTimeout(fallback);
@@ -3423,13 +3522,22 @@ const setupScrollRestoration = (config = {}) => {
3423
3522
  document.removeEventListener(eventName, abortByUser, { capture: true });
3424
3523
  }
3425
3524
  };
3525
+ if (pendingStates.length) {
3526
+ stateDeadline = setTimeout(cancelPendingRestore, restoreMaxTimeout);
3527
+ stateSubscription = merge(...pendingStates)
3528
+ .pipe(ignoreElements())
3529
+ .subscribe({ complete: waitForRender, error: waitForRender });
3530
+ }
3531
+ else {
3532
+ waitForRender();
3533
+ }
3426
3534
  };
3427
3535
  /**
3428
3536
  * The offset the most recently left entry for this page had. A target without query params means
3429
3537
  * "that page", whichever query state it was last in - the crumb linking to an overview does not
3430
3538
  * know, and should not have to reproduce, the filter the user left it under.
3431
3539
  */
3432
- const findLastVisitedOffset = (route, search) => {
3540
+ const findLastVisitedEntry = (route, search) => {
3433
3541
  const entries = [...positions.values()];
3434
3542
  for (let i = entries.length - 1; i >= 0; i--) {
3435
3543
  const entry = entries[i];
@@ -3437,7 +3545,7 @@ const setupScrollRestoration = (config = {}) => {
3437
3545
  continue;
3438
3546
  if (search && entry.search !== search)
3439
3547
  continue;
3440
- return entry.top;
3548
+ return entry;
3441
3549
  }
3442
3550
  return undefined;
3443
3551
  };
@@ -3450,11 +3558,7 @@ const setupScrollRestoration = (config = {}) => {
3450
3558
  // what `findLastVisitedOffset` walks backwards and what the cap below evicts from.
3451
3559
  if (lastNavigationId !== null) {
3452
3560
  positions.delete(lastNavigationId);
3453
- positions.set(lastNavigationId, {
3454
- top: resolveScrollElement().scrollTop,
3455
- route: prev.route,
3456
- search: serializeQueryParams(prev.state.queryParams),
3457
- });
3561
+ positions.set(lastNavigationId, captureEntry());
3458
3562
  }
3459
3563
  if (positions.size > MAX_STORED_POSITIONS) {
3460
3564
  const oldest = positions.keys().next();
@@ -3482,7 +3586,9 @@ const setupScrollRestoration = (config = {}) => {
3482
3586
  const didFragmentChange = prevState.fragment !== currState.fragment;
3483
3587
  prev = curr;
3484
3588
  const wasMarkedAsReturn = wantsRestore;
3589
+ const reloaded = reloadEntry;
3485
3590
  wantsRestore = false;
3591
+ reloadEntry = null;
3486
3592
  if (event instanceof NavigationEnd) {
3487
3593
  lastNavigationId = event.id;
3488
3594
  }
@@ -3496,17 +3602,24 @@ const setupScrollRestoration = (config = {}) => {
3496
3602
  // The saved offset wins over both scroll to top and fragment scrolling: the user may well have
3497
3603
  // scrolled away from the anchor before leaving the page.
3498
3604
  if (target !== undefined) {
3499
- scheduleRestore(target.top);
3605
+ scheduleRestore(target);
3500
3606
  return;
3501
3607
  }
3502
3608
  }
3503
3609
  if (restoreEnabled && wasMarkedAsReturn) {
3504
- const target = findLastVisitedOffset(curr.route, serializeQueryParams(currState.queryParams));
3610
+ const target = findLastVisitedEntry(curr.route, serializeQueryParams(currState.queryParams));
3505
3611
  if (target !== undefined) {
3506
3612
  scheduleRestore(target);
3507
3613
  return;
3508
3614
  }
3509
3615
  }
3616
+ if (reloaded &&
3617
+ event instanceof NavigationEnd &&
3618
+ reloaded.route === curr.route &&
3619
+ reloaded.search === serializeQueryParams(currState.queryParams)) {
3620
+ scheduleRestore(reloaded);
3621
+ return;
3622
+ }
3510
3623
  if (sameUrlNavigation) {
3511
3624
  const allQueryParams = [
3512
3625
  ...new Set(Object.keys(prevState.queryParams).concat(Object.keys(currState.queryParams))),
@@ -3548,8 +3661,13 @@ const setupScrollRestoration = (config = {}) => {
3548
3661
  onNavigationEnd(event);
3549
3662
  }), takeUntilDestroyed())
3550
3663
  .subscribe();
3664
+ const onPageHide = () => writeReloadEntry(captureEntry());
3665
+ if (restoreOnReload) {
3666
+ window.addEventListener('pagehide', onPageHide);
3667
+ }
3551
3668
  destroyRef.onDestroy(() => {
3552
3669
  cancelPendingRestore();
3670
+ window.removeEventListener('pagehide', onPageHide);
3553
3671
  if (restoreEnabled && previousScrollRestoration !== null) {
3554
3672
  history.scrollRestoration = previousScrollRestoration;
3555
3673
  }
@@ -10749,11 +10867,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
10749
10867
 
10750
10868
  // Generated from package.json by tools/scripts/generate-version.js - do not edit.
10751
10869
  /** The version of `@ethlete/core` this build was cut from. */
10752
- const CORE_VERSION = '5.0.0-next.65';
10870
+ const CORE_VERSION = '5.0.0-next.66';
10753
10871
 
10754
10872
  /**
10755
10873
  * Generated bundle index. Do not edit.
10756
10874
  */
10757
10875
 
10758
- export { ANIMATABLE_TOKEN, ANIMATED_IF_TOKEN, ANIMATED_LIFECYCLE_TOKEN, ANIMATION_DEBUG_STORAGE_KEY, ANIMATION_ERROR_CODES, AT_LEAST_ONE_REQUIRED, AnimatableDirective, AnimatedIfDirective, AnimatedLifecycleDirective, AutoSurfaceDirective, BOUNDARY_ELEMENT_TOKEN, BREAKPOINT_INSTANCE_TOKEN, BREAKPOINT_ORDER, COLOR_PALETTE, COLOR_PROVIDER, CORE_VERSION, ClickOutsideDirective, ColorInteractiveContainerDirective, ColorInteractiveDirective, ColorInteractiveExcludeDirective, ColorInteractiveHasFocusDirective, DEFAULT_MULTI_INSTANCE_RELS, DEFAULT_MULTI_INSTANCE_TAGS, DEFAULT_OVERLAY_LAYER, 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, ET_RESTORE_SCROLL, EasingTokensStylesComponent, EthleteValidators, FOCUSABLE_SELECTOR, FOCUS_VISIBLE_TRACKER_TOKEN, HtmlToMarkdownPipe, IS_ARRAY_NOT_EMPTY, IS_EMAIL, InferMimeTypePipe, InitialsPipe, IsArrayNotEmpty, IsEmail, jsonLd as JsonLD, KeyPressManager, MARKDOWN_VERBATIM_ATTR, MUST_MATCH, MarkdownToHtmlPipe, MatchStateType, MustMatch, NOTIFICATION_CLICK_MESSAGE_TYPE, NormalizeGameResultTypePipe, NormalizeMatchParticipantsPipe, NormalizeMatchScorePipe, NormalizeMatchStatePipe, NormalizeMatchTypePipe, OVERLAY_LAYER_ATTRIBUTE, ProvideColorDirective, ProvideSurfaceDirective, RUNTIME_ERROR_NO_DATA, RepeatDirective, ResizeHandlesComponent, RestoreScrollDirective, RuntimeError, SURFACE_COLOR, SURFACE_PROVIDER, SURFACE_TYPE, SWIPE_VELOCITY_WINDOW_MS, ScrollObserverDirective, ScrollObserverEndDirective, ScrollObserverStartDirective, SlugifyPipe, StructuredDataComponent, SurfaceInteractiveDirective, ToArrayPipe, TypedQueryList, UNSAVED_CHANGES_CONFIRM, UNSAVED_CHANGES_ERROR_CODES, UNSAVED_CHANGES_TITLE_MARKER, ValidateAtLeastOneRequired, VisuallyHiddenStylesComponent, anchoredOverlayPosition, animationDebugLog, applyAlternateBinding, applyAlternateLanguagesBindings, applyArticleBindings, applyAuthorBinding, applyCanonicalBinding, applyCenteredPosition, applyDescriptionBinding, applyFaviconOverlay, applyGlobalPosition, applyHeadBinding, applyHeadTitleBinding, applyHeadTitleMarker, applyHostListener, applyHostListeners, applyInitialFocus, applyKeywordsBinding, applyLinkBinding, applyMetaBinding, applyNextBinding, applyOgBinding, applyOpenGraphBindings, applyPrevBinding, applyResourceHintsBindings, applyRobotsBinding, applySocialMediaBindings, applyStructuredDataBinding, applyTwitterCardBindings, boolBreakpointTransform, boundingClientRectToElementRect, breakpointTransformBase, buildElementSignal, buildSignalEffects, canUseSessionMemory, clamp, clone, cloneFormGroup, computedTillFalsy, computedTillTruthy, controlValueSignal, controlValueSignalWithPrevious, copyToClipboard, createAnchoredPositionCleanup, createArrayPropertyBinding, createAutoSessionMemoryKey, createCanAnimateSignal, createComponentId, createCssColorThemeName, createCssSurfaceName, createDestroy, createDocumentElementSignal, createElementDimensions, createEmptyElementSignal, createFlipAnimation, createFlipAnimationGroup, createIsRenderedSignal, createLogger, createObjectUrlHandle, createPropertyBinding, createRootThemeCss, createRoute, createRouterState, createRxHostListener, createSessionMemory, createSwatchCss, createSwipeTracker, createTailwindColorThemes, createTailwindCssVar, createTailwindRgbVar, createThemeStyle, createUnsavedChangesGuard, createUnsavedChangesTabLock, createUnsavedChangesTracker, createUserConsentProvider, deferredSignal, defineLabels, defineProvider, defineRootProvider, defineStaticProvider, defineStaticRootProvider, deleteCookie, dragGestureFrom, easeElastic, easeIn, easeInOut, easeLinear, easeOut, easeOutBack, easeOutBackStrong, elementCanScroll, enableAnchoredOverlayPositionExtras, equal, fetchDeployedBuildFingerprint$, firstElementSignal, focusElement, forceReflow, formatRuntimeError, fromNextFrame, getCookie, getDomain, getElementScrollCoordinates, getFocusableElements, getFormGroupValue, getGroupMatchPoints, getGroupMatchScore, getHeadingElement, getKnockoutMatchScore, getMatchScoreSubLine, getObjectProperty, getScrollContainerTarget, getScrollItemTarget, getScrollSnapTarget, hasAnchoredOverlayPositionExtras, hasCookie, holdScrollRestoration, htmlToMarkdown, inferMimeType, initials, injectAngularRootElement, injectAnimatedBlockSize, injectAppUpdates, injectAppUpdatesConfig, injectBoundaryElement, injectBreakpointInput, injectBreakpointIsMatched, injectBreakpointObserver, injectCanHover, injectColorPalette, injectColorScheme, injectColorThemes, injectColorThemesPrefix, injectCurrentBreakpoint, injectDefaultColorTheme, injectDefaultSurfaceTheme, injectDeviceInputType, injectDisplayOrientation, injectErrorTheme, injectFaviconStore, injectFileDownload, injectFocusVisibleTracker, injectFragment, injectHasPrecisionInput, injectHasTouchInput, injectHostElement, injectIs2Xl, injectIsDocumentVisible, injectIsLandscape, injectIsLg, injectIsMd, injectIsPortrait, injectIsRouterInitialized, injectIsSm, injectIsXl, injectIsXs, injectLinkStore, injectLinkStoreConfig, injectLocale, injectMediaQueryIsMatched, injectMetaConfig, injectMetaStore, injectNotifications, injectObserveBreakpoint, injectObserveMediaQuery, injectOverlayRuntime, injectParentSurface, injectPathParam, injectPathParamChanges, injectPathParams, injectPrefersReducedMotion, injectQueryParam, injectQueryParamAll, injectQueryParamChanges, injectQueryParams, injectRenderer, injectRootSurfaceTheme, injectRoute, injectRouteData, injectRouteDataItem, injectRouteTitle, injectRouterEvent, injectRouterNavigationState, injectRouterState, injectScrollbarDimensions, injectSemanticColorTheme, injectStructuredDataConfig, injectStructuredDataStore, injectStyleManager, injectSuccessTheme, injectSurfaceColorPalette, injectSurfaceContextTracker, injectSurfaceThemes, injectSurfaceThemesPrefix, injectSurfaceType, injectTemplateRef, injectTitleConfig, injectTitleStore, injectUnsavedChangesCoordinator, injectUrl, injectViewportConfig, injectViewportDimensions, injectViewportSize, injectWarningTheme, isAnimationDebugEnabled, isArray, isElement, isElementSignal, isElementVisible, isFocusable, isGroupMatch, isHTMLElement, isHTMLOrSVGElement, isKnockoutMatch, isObject, isOnHigherOverlayLayer, isSafeLinkUrl, isSafeUrl, isStaleBuildError, markdownToHtml, matchesReducedMotion, maybeSignalValue, memoizeSignal, mountEasingTokens, mountVisuallyHidden, nextFrame, normalizeGameResultType, normalizeMatchParticipant, normalizeMatchParticipants, normalizeMatchScore, normalizeMatchState, normalizeMatchType, normalizeUnsavedChangesSource, numberBreakpointTransform, onOverlayViewportInsetsChange, optionalBooleanAttribute, overlayViewportInsets, overlayViewportInsetsFor, ownsActiveElement, previousSignalValue, provideAppUpdates, provideAppUpdatesConfig, provideAppUpdatesInstance, provideBoundaryElement, provideBreakpointInstance, provideBreakpointObserver, provideColorPalette, provideColorScheme, provideColorThemes, provideColorThemesWithTailwind4, provideFaviconStore, provideFocusVisibleTracker, provideLinkStore, provideLinkStoreConfig, provideLocale, provideMetaConfig, provideMetaStore, provideNotifications, provideOverlayRuntime, provideRenderer, provideStructuredDataConfig, provideStructuredDataStore, provideStyleManager, provideSurfaceContextTracker, provideSurfaceThemesWithTailwind4, provideTitleConfig, provideTitleStore, provideUnsavedChangesConfirm, provideUnsavedChangesCoordinator, provideViewportConfig, randomId, readBuildFingerprint, readFromClipboard, reserveOverlayViewportSpace, resolveAppRootColorProvider, resolveColorThemeVariant, resolveOverlayLayer, resolveSurfaceByElevation, round, routerDisableScrollTop, routerRestoreScroll, scrollToElement, setCookie, setInputSignal, setupFocusTrap, setupPositioning, setupScrollRestoration, signalAnimatedNumber, signalAttributes, signalClasses, signalCountdown, signalDeferredLoading, signalElementChildren, signalElementDimensions, signalElementIntersection, signalElementLastScrollDirection, signalElementMutations, signalElementScrollState, signalHostAttributes, signalHostClasses, signalHostElementDimensions, signalHostElementIntersection, signalHostElementLastScrollDirection, signalHostElementMutations, signalHostElementScrollState, signalHostStyles, signalIsRendered, signalStyles, slugify, suppressTextSelection, switchQueryListChanges, syncSignal, toArray, toArrayTrackByFn, toInjectFn, toProvideFn, toStringBinding, toToken, transformOrReturn, typedBreakpointTransform, useCursorDragScroll, writeScrollbarSizeToCssVariables, writeViewportSizeToCssVariables, ɵProvideColorThemes, ɵProvideColorThemesPrefix, ɵProvideSurfaceThemes, ɵProvideSurfaceThemesPrefix };
10876
+ export { ANIMATABLE_TOKEN, ANIMATED_IF_TOKEN, ANIMATED_LIFECYCLE_TOKEN, ANIMATION_DEBUG_STORAGE_KEY, ANIMATION_ERROR_CODES, AT_LEAST_ONE_REQUIRED, AnimatableDirective, AnimatedIfDirective, AnimatedLifecycleDirective, AutoSurfaceDirective, BOUNDARY_ELEMENT_TOKEN, BREAKPOINT_INSTANCE_TOKEN, BREAKPOINT_ORDER, COLOR_PALETTE, COLOR_PROVIDER, CORE_VERSION, ClickOutsideDirective, ColorInteractiveContainerDirective, ColorInteractiveDirective, ColorInteractiveExcludeDirective, ColorInteractiveHasFocusDirective, DEFAULT_MULTI_INSTANCE_RELS, DEFAULT_MULTI_INSTANCE_TAGS, DEFAULT_OVERLAY_LAYER, 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, ET_RESTORE_SCROLL, EasingTokensStylesComponent, EthleteValidators, FOCUSABLE_SELECTOR, FOCUS_VISIBLE_TRACKER_TOKEN, HtmlToMarkdownPipe, IS_ARRAY_NOT_EMPTY, IS_EMAIL, InferMimeTypePipe, InitialsPipe, IsArrayNotEmpty, IsEmail, jsonLd as JsonLD, KeyPressManager, MARKDOWN_VERBATIM_ATTR, MUST_MATCH, MarkdownToHtmlPipe, MatchStateType, MustMatch, NOTIFICATION_CLICK_MESSAGE_TYPE, NormalizeGameResultTypePipe, NormalizeMatchParticipantsPipe, NormalizeMatchScorePipe, NormalizeMatchStatePipe, NormalizeMatchTypePipe, OVERLAY_LAYER_ATTRIBUTE, ProvideColorDirective, ProvideSurfaceDirective, RUNTIME_ERROR_NO_DATA, RepeatDirective, ResizeHandlesComponent, RestoreScrollDirective, RuntimeError, SURFACE_COLOR, SURFACE_PROVIDER, SURFACE_TYPE, SWIPE_VELOCITY_WINDOW_MS, ScrollObserverDirective, ScrollObserverEndDirective, ScrollObserverStartDirective, SlugifyPipe, StructuredDataComponent, SurfaceInteractiveDirective, ToArrayPipe, TypedQueryList, UNSAVED_CHANGES_CONFIRM, UNSAVED_CHANGES_ERROR_CODES, UNSAVED_CHANGES_TITLE_MARKER, ValidateAtLeastOneRequired, VisuallyHiddenStylesComponent, anchoredOverlayPosition, animationDebugLog, applyAlternateBinding, applyAlternateLanguagesBindings, applyArticleBindings, applyAuthorBinding, applyCanonicalBinding, applyCenteredPosition, applyDescriptionBinding, applyFaviconOverlay, applyGlobalPosition, applyHeadBinding, applyHeadTitleBinding, applyHeadTitleMarker, applyHostListener, applyHostListeners, applyInitialFocus, applyKeywordsBinding, applyLinkBinding, applyMetaBinding, applyNextBinding, applyOgBinding, applyOpenGraphBindings, applyPrevBinding, applyResourceHintsBindings, applyRobotsBinding, applySocialMediaBindings, applyStructuredDataBinding, applyTwitterCardBindings, boolBreakpointTransform, boundingClientRectToElementRect, breakpointTransformBase, buildElementSignal, buildSignalEffects, canUseSessionMemory, clamp, clone, cloneFormGroup, computedTillFalsy, computedTillTruthy, controlValueSignal, controlValueSignalWithPrevious, copyToClipboard, createAnchoredPositionCleanup, createArrayPropertyBinding, createAutoSessionMemoryKey, createCanAnimateSignal, createComponentId, createCssColorThemeName, createCssSurfaceName, createDestroy, createDocumentElementSignal, createElementDimensions, createEmptyElementSignal, createFlipAnimation, createFlipAnimationGroup, createIsRenderedSignal, createLogger, createObjectUrlHandle, createPropertyBinding, createRootThemeCss, createRoute, createRouterState, createRxHostListener, createSessionMemory, createSwatchCss, createSwipeTracker, createTailwindColorThemes, createTailwindCssVar, createTailwindRgbVar, createThemeStyle, createUnsavedChangesGuard, createUnsavedChangesTabLock, createUnsavedChangesTracker, createUserConsentProvider, deferredSignal, defineLabels, defineProvider, defineRootProvider, defineStaticProvider, defineStaticRootProvider, deleteCookie, dragGestureFrom, easeElastic, easeIn, easeInOut, easeLinear, easeOut, easeOutBack, easeOutBackStrong, elementCanScroll, enableAnchoredOverlayPositionExtras, equal, fetchDeployedBuildFingerprint$, firstElementSignal, focusElement, forceReflow, formatRuntimeError, fromNextFrame, getCookie, getDomain, getElementScrollCoordinates, getFocusableElements, getFormGroupValue, getGroupMatchPoints, getGroupMatchScore, getHeadingElement, getKnockoutMatchScore, getMatchScoreSubLine, getObjectProperty, getScrollContainerTarget, getScrollItemTarget, getScrollSnapTarget, hasAnchoredOverlayPositionExtras, hasCookie, holdScrollRestoration, htmlToMarkdown, inferMimeType, initials, injectAngularRootElement, injectAnimatedBlockSize, injectAppUpdates, injectAppUpdatesConfig, injectBoundaryElement, injectBreakpointInput, injectBreakpointIsMatched, injectBreakpointObserver, injectCanHover, injectColorPalette, injectColorScheme, injectColorThemes, injectColorThemesPrefix, injectCurrentBreakpoint, injectDefaultColorTheme, injectDefaultSurfaceTheme, injectDeviceInputType, injectDisplayOrientation, injectErrorTheme, injectFaviconStore, injectFileDownload, injectFocusVisibleTracker, injectFragment, injectHasPrecisionInput, injectHasTouchInput, injectHostElement, injectIs2Xl, injectIsDocumentVisible, injectIsLandscape, injectIsLg, injectIsMd, injectIsPortrait, injectIsRouterInitialized, injectIsSm, injectIsXl, injectIsXs, injectLinkStore, injectLinkStoreConfig, injectLocale, injectMediaQueryIsMatched, injectMetaConfig, injectMetaStore, injectNotifications, injectObserveBreakpoint, injectObserveMediaQuery, injectOverlayRuntime, injectParentSurface, injectPathParam, injectPathParamChanges, injectPathParams, injectPrefersReducedMotion, injectQueryParam, injectQueryParamAll, injectQueryParamChanges, injectQueryParams, injectRenderer, injectRootSurfaceTheme, injectRoute, injectRouteData, injectRouteDataItem, injectRouteTitle, injectRouterEvent, injectRouterNavigationState, injectRouterState, injectScrollbarDimensions, injectSemanticColorTheme, injectStructuredDataConfig, injectStructuredDataStore, injectStyleManager, injectSuccessTheme, injectSurfaceColorPalette, injectSurfaceContextTracker, injectSurfaceThemes, injectSurfaceThemesPrefix, injectSurfaceType, injectTemplateRef, injectTitleConfig, injectTitleStore, injectUnsavedChangesCoordinator, injectUrl, injectViewportConfig, injectViewportDimensions, injectViewportSize, injectWarningTheme, isAnimationDebugEnabled, isArray, isElement, isElementSignal, isElementVisible, isFocusable, isGroupMatch, isHTMLElement, isHTMLOrSVGElement, isKnockoutMatch, isObject, isOnHigherOverlayLayer, isSafeLinkUrl, isSafeUrl, isStaleBuildError, markdownToHtml, matchesReducedMotion, maybeSignalValue, memoizeSignal, mountEasingTokens, mountVisuallyHidden, nextFrame, normalizeGameResultType, normalizeMatchParticipant, normalizeMatchParticipants, normalizeMatchScore, normalizeMatchState, normalizeMatchType, normalizeUnsavedChangesSource, numberBreakpointTransform, onOverlayViewportInsetsChange, optionalBooleanAttribute, overlayViewportInsets, overlayViewportInsetsFor, ownsActiveElement, previousSignalValue, provideAppUpdates, provideAppUpdatesConfig, provideAppUpdatesInstance, provideBoundaryElement, provideBreakpointInstance, provideBreakpointObserver, provideColorPalette, provideColorScheme, provideColorThemes, provideColorThemesWithTailwind4, provideFaviconStore, provideFocusVisibleTracker, provideLinkStore, provideLinkStoreConfig, provideLocale, provideMetaConfig, provideMetaStore, provideNotifications, provideOverlayRuntime, provideRenderer, provideStructuredDataConfig, provideStructuredDataStore, provideStyleManager, provideSurfaceContextTracker, provideSurfaceThemesWithTailwind4, provideTitleConfig, provideTitleStore, provideUnsavedChangesConfirm, provideUnsavedChangesCoordinator, provideViewportConfig, randomId, readBuildFingerprint, readFromClipboard, registerScrollRestorationState, reserveOverlayViewportSpace, resolveAppRootColorProvider, resolveColorThemeVariant, resolveOverlayLayer, resolveSurfaceByElevation, round, routerDisableScrollTop, routerRestoreScroll, scrollToElement, setCookie, setInputSignal, setupFocusTrap, setupPositioning, setupScrollRestoration, signalAnimatedNumber, signalAttributes, signalClasses, signalCountdown, signalDeferredLoading, signalElementChildren, signalElementDimensions, signalElementIntersection, signalElementLastScrollDirection, signalElementMutations, signalElementScrollState, signalHostAttributes, signalHostClasses, signalHostElementDimensions, signalHostElementIntersection, signalHostElementLastScrollDirection, signalHostElementMutations, signalHostElementScrollState, signalHostStyles, signalIsRendered, signalStyles, slugify, suppressTextSelection, switchQueryListChanges, syncSignal, toArray, toArrayTrackByFn, toInjectFn, toProvideFn, toStringBinding, toToken, transformOrReturn, typedBreakpointTransform, useCursorDragScroll, writeScrollbarSizeToCssVariables, writeViewportSizeToCssVariables, ɵProvideColorThemes, ɵProvideColorThemesPrefix, ɵProvideSurfaceThemes, ɵProvideSurfaceThemesPrefix };
10759
10877
  //# sourceMappingURL=ethlete-core.mjs.map