@ethlete/core 5.0.0-next.57 → 5.0.0-next.59

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,23 @@
1
1
  # @ethlete/core
2
2
 
3
+ ## 5.0.0-next.59
4
+
5
+ ### Patch Changes
6
+
7
+ - The legacy theme stylesheets carry the page's `ngCspNonce`, and `et-structured-data` no longer writes a static `style` attribute, so both pass a strict `style-src`.
8
+ - `markdownToHtml` renders block and table-cell alignment as an `et-rte-align-*` class instead of an inline `text-align` style, which a strict `style-src` dropped; `htmlToMarkdown` reads both.
9
+
10
+ ## 5.0.0-next.58
11
+
12
+ ### Minor Changes
13
+
14
+ - Add `signalCountdown(deadline)`, a signal of the days, hours, minutes and seconds left until a deadline, recounted on the whole second.
15
+ - Overlays and `[etTooltip]` can anchor to an SVG element, and `[etTooltip]` takes an `anchor` input to point at an element other than its trigger; core exports `isElement` and `isHTMLOrSVGElement`.
16
+
17
+ ### Patch Changes
18
+
19
+ - Place `takeUntilDestroyed()` last in every pipe, so operators after it no longer run or stay subscribed after destroy.
20
+
3
21
  ## 5.0.0-next.57
4
22
 
5
23
  ### Major Changes
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { assertInInjectionContext, inject, DestroyRef, ElementRef, TemplateRef, InjectionToken, QueryList, RendererFactory2, RendererStyleFlags2, isSignal, DOCUMENT, signal, linkedSignal, isDevMode, computed, afterNextRender, effect, untracked, ApplicationRef, runInInjectionContext, NgZone, Injector, booleanAttribute, numberAttribute, PLATFORM_ID, EnvironmentInjector, createComponent, ViewEncapsulation, Component, Directive, model, ViewContainerRef, input, provideEnvironmentInitializer, output, createEnvironmentInjector, Pipe, 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, pairwise, debounceTime, merge, distinctUntilChanged, EMPTY, tap, take, filter, BehaviorSubject, combineLatest, Observable, isObservable, firstValueFrom, defaultIfEmpty, concatMap, concat, finalize, exhaustMap, share, shareReplay } from 'rxjs';
4
+ import { Subject, fromEvent, switchMap, startWith, of, defer, from, map, catchError, timer, takeUntil, pairwise, debounceTime, merge, distinctUntilChanged, EMPTY, expand, skip, tap, take, filter, BehaviorSubject, combineLatest, Observable, isObservable, firstValueFrom, defaultIfEmpty, concatMap, concat, finalize, exhaustMap, share, shareReplay } 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, DOCUMENT as DOCUMENT$1 } from '@angular/common';
@@ -1779,6 +1779,59 @@ const controlValueSignalWithPrevious = (control, options) => {
1779
1779
  return data.asReadonly();
1780
1780
  };
1781
1781
 
1782
+ const SECOND_MS = 1000;
1783
+ const toTimestamp = (deadline) => {
1784
+ if (deadline === null || deadline === undefined || deadline === '')
1785
+ return null;
1786
+ const timestamp = new Date(deadline).getTime();
1787
+ return Number.isNaN(timestamp) ? null : timestamp;
1788
+ };
1789
+ const toCountdown = (remainingMs) => {
1790
+ const totalSeconds = Math.max(0, Math.ceil(remainingMs / SECOND_MS));
1791
+ return {
1792
+ totalSeconds,
1793
+ days: Math.floor(totalSeconds / 86_400),
1794
+ hours: Math.floor((totalSeconds % 86_400) / 3600),
1795
+ minutes: Math.floor((totalSeconds % 3600) / 60),
1796
+ seconds: totalSeconds % 60,
1797
+ hasPassed: totalSeconds === 0,
1798
+ };
1799
+ };
1800
+ /**
1801
+ * The time left until `deadline`, recounted on every whole second and broken down into days, hours, minutes
1802
+ * and seconds. `null` while the deadline is missing or not a valid date. The timer stops once the deadline
1803
+ * has passed, and never runs on the server.
1804
+ *
1805
+ * Call in an injection context.
1806
+ *
1807
+ * ```ts
1808
+ * protected timeLeft = signalCountdown(computed(() => this.round()?.startsAt));
1809
+ * ```
1810
+ */
1811
+ const signalCountdown = (deadline) => {
1812
+ const end = computed(() => toTimestamp(deadline()), /* @ts-ignore */
1813
+ ...(ngDevMode ? [{ debugName: "end" }] : /* istanbul ignore next */ []));
1814
+ const tick = signal(0, /* @ts-ignore */
1815
+ ...(ngDevMode ? [{ debugName: "tick" }] : /* istanbul ignore next */ []));
1816
+ if (isPlatformBrowser(inject(PLATFORM_ID))) {
1817
+ toObservable(end)
1818
+ .pipe(switchMap((endsAt) => {
1819
+ if (endsAt === null)
1820
+ return EMPTY;
1821
+ return of(null).pipe(expand(() => {
1822
+ const remainingMs = endsAt - Date.now();
1823
+ return remainingMs <= 0 ? EMPTY : timer(remainingMs % SECOND_MS || SECOND_MS);
1824
+ }), skip(1));
1825
+ }), takeUntilDestroyed())
1826
+ .subscribe(() => tick.update((count) => count + 1));
1827
+ }
1828
+ return computed(() => {
1829
+ tick();
1830
+ const endsAt = end();
1831
+ return endsAt === null ? null : toCountdown(endsAt - Date.now());
1832
+ });
1833
+ };
1834
+
1782
1835
  /**
1783
1836
  * Gates a loading indicator on a loading flag, so work that finishes quickly never flashes one: the
1784
1837
  * returned signal turns true only once `source` has been true for `delay` ms, and then stays true for
@@ -2771,10 +2824,10 @@ const useCursorDragScroll = (el, options) => {
2771
2824
  if (!el)
2772
2825
  return;
2773
2826
  mouseMove
2774
- .pipe(takeUntilDestroyed(destroyRef), takeUntil(dragEnd), tap((e) => updateDragging(e)))
2827
+ .pipe(takeUntil(dragEnd), tap((e) => updateDragging(e)), takeUntilDestroyed(destroyRef))
2775
2828
  .subscribe();
2776
2829
  dragEnd
2777
- .pipe(take(1), takeUntilDestroyed(destroyRef), tap(() => updateDraggingEnd()))
2830
+ .pipe(take(1), tap(() => updateDraggingEnd()), takeUntilDestroyed(destroyRef))
2778
2831
  .subscribe();
2779
2832
  initialDragPosition.set({ x: e.clientX, y: e.clientY });
2780
2833
  initialScrollPosition.set({ x: el.scrollLeft, y: el.scrollTop });
@@ -3417,7 +3470,9 @@ const parseSeparatorAligns = (line) => parseTableRow(line).map((cell) => {
3417
3470
  });
3418
3471
  /** The GFM separator token for a column alignment. */
3419
3472
  const separatorFor = (align) => align === 'center' ? ':---:' : align === 'right' ? '---:' : align === 'left' ? ':---' : '---';
3420
- const alignStyle = (align) => (align ? ` style="text-align: ${align}"` : '');
3473
+ const alignClass = (align) => (align ? ` class="et-rte-align-${align}"` : '');
3474
+ const alignOf = (attrs) => (/\bclass\s*=\s*["'][^"']*\bet-rte-align-([a-z]+)/i.exec(attrs)?.[1] ??
3475
+ /\bstyle\s*=\s*["'][^"']*text-align:\s*([a-z]+)/i.exec(attrs)?.[1])?.toLowerCase() ?? null;
3421
3476
  /** Wraps `content` in an emphasis `marker`, hoisting boundary whitespace outside the delimiters -
3422
3477
  * CommonMark emphasis must not face whitespace on the inside (`** fett**` doesn't parse), and
3423
3478
  * `&nbsp;` counts as whitespace there too. Whitespace-only content stays unwrapped. */
@@ -3684,11 +3739,11 @@ const markdownToHtml = (markdown) => {
3684
3739
  // Rebuild it instead of passing it through verbatim: only the alignment survives on the tag
3685
3740
  // (no other attributes, e.g. event handlers) and the inner markup is reduced to the editor's
3686
3741
  // own inline vocabulary.
3687
- const aligned = /^<(p|h[1-6]|div)\b[^>]*\bstyle=["'][^"']*text-align:\s*([a-z]+)[^>]*>([\s\S]*)<\/\1>$/i.exec(trimmed);
3688
- if (aligned) {
3742
+ const aligned = /^<(p|h[1-6]|div)\b([^>]*)>([\s\S]*)<\/\1>$/i.exec(trimmed);
3743
+ const align = aligned ? alignOf(aligned[2] ?? '') : null;
3744
+ if (aligned && align) {
3689
3745
  const tag = (aligned[1] ?? 'p').toLowerCase();
3690
- const align = (aligned[2] ?? 'left').toLowerCase();
3691
- return `<${tag} style="text-align: ${align}">${sanitizeInlineHtml(aligned[3] ?? '')}</${tag}>`;
3746
+ return `<${tag}${alignClass(align)}>${sanitizeInlineHtml(aligned[3] ?? '')}</${tag}>`;
3692
3747
  }
3693
3748
  // Heading
3694
3749
  const headingMatch = trimmed.match(/^(#{1,6})\s+(.+)$/);
@@ -3705,13 +3760,13 @@ const markdownToHtml = (markdown) => {
3705
3760
  const aligns = parseSeparatorAligns(tableLines[1] ?? '');
3706
3761
  const headers = parseTableRow(tableLines[0] ?? '');
3707
3762
  const thead = `<thead><tr>${headers
3708
- .map((h, i) => `<th${alignStyle(aligns[i] ?? null)}>${processInline(h)}</th>`)
3763
+ .map((h, i) => `<th${alignClass(aligns[i] ?? null)}>${processInline(h)}</th>`)
3709
3764
  .join('')}</tr></thead>`;
3710
3765
  const bodyRows = tableLines.slice(2);
3711
3766
  const tbody = bodyRows.length > 0
3712
3767
  ? `<tbody>${bodyRows
3713
3768
  .map((row) => `<tr>${parseTableRow(row)
3714
- .map((cell, i) => `<td${alignStyle(aligns[i] ?? null)}>${processInline(cell)}</td>`)
3769
+ .map((cell, i) => `<td${alignClass(aligns[i] ?? null)}>${processInline(cell)}</td>`)
3715
3770
  .join('')}</tr>`)
3716
3771
  .join('')}</tbody>`
3717
3772
  : '';
@@ -3752,7 +3807,10 @@ const htmlToMarkdown = (html) => {
3752
3807
  // inner markup stays HTML) and round-trip via a placeholder - extracted before the block passes
3753
3808
  // below rewrite them, restored after the final tag-strip.
3754
3809
  const alignedBlocks = [];
3755
- md = md.replace(/<(p|h[1-6]|div)\b[^>]*\bstyle="[^"]*text-align[^"]*"[^>]*>[\s\S]*?<\/\1>/gi, (match) => makePlaceholder('ALIGN', alignedBlocks.push(match) - 1));
3810
+ md = md.replace(/<(p|h[1-6]|div)\b([^>]*\b(?:style="[^"]*text-align|class="[^"]*\bet-rte-align-)[^>]*)>([\s\S]*?)<\/\1>/gi, (_, tag, attrs, inner) => {
3811
+ const name = tag.toLowerCase();
3812
+ return makePlaceholder('ALIGN', alignedBlocks.push(`<${name} style="text-align: ${alignOf(attrs)}">${inner}</${name}>`) - 1);
3813
+ });
3756
3814
  // Code blocks - process before inline code
3757
3815
  md = md.replace(/<pre[^>]*><code[^>]*class="language-([^"]+)"[^>]*>([\s\S]*?)<\/code><\/pre>/gi, (_, lang, code) => `\n\`\`\`${lang}\n${unescapeHtml(code.trim())}\n\`\`\`\n`);
3758
3816
  md = md.replace(/<pre[^>]*><code[^>]*>([\s\S]*?)<\/code><\/pre>/gi, (_, code) => `\n\`\`\`\n${unescapeHtml(code.trim())}\n\`\`\`\n`);
@@ -3806,8 +3864,8 @@ const htmlToMarkdown = (html) => {
3806
3864
  const extractCells = (row) => [...row.matchAll(/<t[hd][^>]*>([\s\S]*?)<\/t[hd]>/gi)].map((m) => stripTags((m[1] ?? '').replace(/<br\s*\/?>/gi, ' ')).trim());
3807
3865
  // GFM alignment is per column, read from the header cells' text-align styles
3808
3866
  const extractAligns = (row) => [...row.matchAll(/<t[hd]([^>]*)>/gi)].map((m) => {
3809
- const align = /text-align:\s*(left|center|right)/i.exec(m[1] ?? '')?.[1]?.toLowerCase();
3810
- return align ?? null;
3867
+ const align = alignOf(m[1] ?? '');
3868
+ return align === 'left' || align === 'center' || align === 'right' ? align : null;
3811
3869
  });
3812
3870
  const theadMatch = tableContent.match(/<thead[^>]*>([\s\S]*?)<\/thead>/i);
3813
3871
  const firstTrMatch = tableContent.match(/<tr[^>]*>([\s\S]*?)<\/tr>/i);
@@ -6183,7 +6241,7 @@ class StructuredDataComponent {
6183
6241
  ...(ngDevMode ? [{ debugName: "jsonLD" }] : /* istanbul ignore next */ []));
6184
6242
  }
6185
6243
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StructuredDataComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6186
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: StructuredDataComponent, isStandalone: true, selector: "et-structured-data", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "innerHTML": "jsonLD()" }, styleAttribute: "display: none" }, ngImport: i0, template: '', isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
6244
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: StructuredDataComponent, isStandalone: true, selector: "et-structured-data", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.display": "\"none\"", "innerHTML": "jsonLD()" } }, ngImport: i0, template: '', isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
6187
6245
  }
6188
6246
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StructuredDataComponent, decorators: [{
6189
6247
  type: Component,
@@ -6192,7 +6250,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
6192
6250
  template: '',
6193
6251
  encapsulation: ViewEncapsulation.None,
6194
6252
  host: {
6195
- style: 'display: none',
6253
+ '[style.display]': '"none"',
6196
6254
  '[innerHTML]': 'jsonLD()',
6197
6255
  },
6198
6256
  }]
@@ -7033,7 +7091,7 @@ class DragHandleDirective {
7033
7091
  ...(ngDevMode ? [{ debugName: "commitThreshold" }] : /* istanbul ignore next */ []));
7034
7092
  this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
7035
7093
  this.gestureStart$ = new Subject();
7036
- this.gesture$ = this.gestureStart$.pipe(exhaustMap((event) => dragGestureFrom(event, this.el.nativeElement, { commitThreshold: this.commitThreshold() })), takeUntilDestroyed(), share());
7094
+ this.gesture$ = this.gestureStart$.pipe(exhaustMap((event) => dragGestureFrom(event, this.el.nativeElement, { commitThreshold: this.commitThreshold() })), share(), takeUntilDestroyed());
7037
7095
  this.dragTapped = outputFromObservable(this.gesture$.pipe(filter((e) => e.type === 'tapped'), map(() => undefined)));
7038
7096
  this.dragStarted = outputFromObservable(this.gesture$.pipe(filter((e) => e.type === 'start'), map((e) => e.data)));
7039
7097
  this.dragMoved = outputFromObservable(this.gesture$.pipe(filter((e) => e.type === 'move'), map((e) => e.data)));
@@ -7315,6 +7373,16 @@ const isHTMLElement = (value) => {
7315
7373
  const view = value?.ownerDocument?.defaultView;
7316
7374
  return view ? value instanceof view.HTMLElement : value instanceof HTMLElement;
7317
7375
  };
7376
+ const isElement = (value) => {
7377
+ const view = value?.ownerDocument?.defaultView;
7378
+ return view ? value instanceof view.Element : value instanceof Element;
7379
+ };
7380
+ const isHTMLOrSVGElement = (value) => {
7381
+ const view = value?.ownerDocument?.defaultView;
7382
+ return view
7383
+ ? value instanceof view.HTMLElement || value instanceof view.SVGElement
7384
+ : value instanceof HTMLElement || value instanceof SVGElement;
7385
+ };
7318
7386
  /**
7319
7387
  * Whether the overlay rooted at `hostElement` is still the owner of DOM focus - focus is inside it, or
7320
7388
  * nothing is focused. False once the user has moved focus somewhere else.
@@ -7750,7 +7818,7 @@ const createAnchoredPositionCleanup = (strategy, paneElement, overlayRef, render
7750
7818
  // or `autoCloseIfReferenceHidden` asked for it: a trigger destroyed while its overlay is open (a
7751
7819
  // menu item that removes the button it was opened from) would otherwise fly to the corner for the
7752
7820
  // frames the overlay takes to animate out.
7753
- if (isHTMLElement(strategy.referenceElement) && !strategy.referenceElement.isConnected) {
7821
+ if (isElement(strategy.referenceElement) && !strategy.referenceElement.isConnected) {
7754
7822
  handleUnusableReference();
7755
7823
  return;
7756
7824
  }
@@ -8094,7 +8162,9 @@ const OVERLAY_RUNTIME_DEF = /* @__PURE__ */ defineRootProvider(() => {
8094
8162
  const paneElement = renderer.createElement('div');
8095
8163
  const backdropElement = signal(null, /* @ts-ignore */
8096
8164
  ...(ngDevMode ? [{ debugName: "backdropElement" }] : /* istanbul ignore next */ []));
8097
- const previousFocusedElement = isHTMLElement(targetDocument.activeElement) ? targetDocument.activeElement : null;
8165
+ const previousFocusedElement = isHTMLOrSVGElement(targetDocument.activeElement)
8166
+ ? targetDocument.activeElement
8167
+ : null;
8098
8168
  const autoFocus = config.autoFocus ?? 'first-tabbable';
8099
8169
  let currentHasBackdrop = config.hasBackdrop !== false;
8100
8170
  let currentPositionStrategy = config.positionStrategy;
@@ -8168,7 +8238,7 @@ const OVERLAY_RUNTIME_DEF = /* @__PURE__ */ defineRootProvider(() => {
8168
8238
  openEntriesState.update((entries) => [...entries, overlayRef]);
8169
8239
  let positionCleanup = setupPositioning(activeConfig(), hostElement, paneElement, overlayRef, renderer);
8170
8240
  cleanupFns.push(() => positionCleanup());
8171
- const getOriginElement = () => currentPositionStrategy?.kind === 'anchored' && isHTMLElement(currentPositionStrategy.referenceElement)
8241
+ const getOriginElement = () => currentPositionStrategy?.kind === 'anchored' && isElement(currentPositionStrategy.referenceElement)
8172
8242
  ? currentPositionStrategy.referenceElement
8173
8243
  : null;
8174
8244
  overlayRef.attachPositionUpdater((strategy) => {
@@ -8283,7 +8353,7 @@ const OVERLAY_RUNTIME_DEF = /* @__PURE__ */ defineRootProvider(() => {
8283
8353
  return;
8284
8354
  }
8285
8355
  const target = event.target;
8286
- if (!isHTMLElement(target) || paneElement.contains(target)) {
8356
+ if (!isElement(target) || paneElement.contains(target)) {
8287
8357
  return;
8288
8358
  }
8289
8359
  if (isOnHigherOverlayLayer(target, layer)) {
@@ -8297,7 +8367,7 @@ const OVERLAY_RUNTIME_DEF = /* @__PURE__ */ defineRootProvider(() => {
8297
8367
  const originElement = getOriginElement();
8298
8368
  if (originElement && originElement.contains(target)) {
8299
8369
  const swallowReopenClick = (clickEvent) => {
8300
- if (isHTMLElement(clickEvent.target) && originElement.contains(clickEvent.target)) {
8370
+ if (isElement(clickEvent.target) && originElement.contains(clickEvent.target)) {
8301
8371
  clickEvent.stopImmediatePropagation();
8302
8372
  clickEvent.preventDefault();
8303
8373
  }
@@ -9006,316 +9076,6 @@ const toArray = (value) => {
9006
9076
  };
9007
9077
  const toArrayTrackByFn = (_, item) => item;
9008
9078
 
9009
- const createPropHandlers = () => {
9010
- const id = createComponentId('et-props');
9011
- const elementRef = inject(ElementRef);
9012
- const classes = signalHostClasses({});
9013
- const attributes = signalHostAttributes({});
9014
- const styles = signalHostStyles({});
9015
- return {
9016
- classes,
9017
- attributes,
9018
- styles,
9019
- id,
9020
- elementRef,
9021
- };
9022
- };
9023
-
9024
- const createElementDictionary = () => {
9025
- const dictionary = {
9026
- ids: signal([]),
9027
- elements: signal({}),
9028
- };
9029
- const firstElement = computed(() => {
9030
- const id = dictionary.ids()[0];
9031
- return id ? (dictionary.elements()[id] ?? null) : null;
9032
- }, /* @ts-ignore */
9033
- ...(ngDevMode ? [{ debugName: "firstElement" }] : /* istanbul ignore next */ []));
9034
- const firstId = computed(() => {
9035
- const id = dictionary.ids()[0];
9036
- return id ?? null;
9037
- }, /* @ts-ignore */
9038
- ...(ngDevMode ? [{ debugName: "firstId" }] : /* istanbul ignore next */ []));
9039
- const ids = computed(() => dictionary.ids(), /* @ts-ignore */
9040
- ...(ngDevMode ? [{ debugName: "ids" }] : /* istanbul ignore next */ []));
9041
- const elements = computed(() => {
9042
- const byId = dictionary.elements();
9043
- return ids()
9044
- .map((id) => byId[id])
9045
- .filter((element) => !!element);
9046
- }, /* @ts-ignore */
9047
- ...(ngDevMode ? [{ debugName: "elements" }] : /* istanbul ignore next */ []));
9048
- const isEmpty = computed(() => dictionary.ids().length === 0, /* @ts-ignore */
9049
- ...(ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []));
9050
- const has = (id) => {
9051
- return dictionary.ids().includes(id);
9052
- };
9053
- const push = (id, element) => {
9054
- dictionary.ids.set([...dictionary.ids(), id]);
9055
- dictionary.elements.set({ ...dictionary.elements(), [id]: element });
9056
- };
9057
- const remove = (id) => {
9058
- dictionary.ids.set(dictionary.ids().filter((i) => i !== id));
9059
- dictionary.elements.set(Object.fromEntries(Object.entries(dictionary.elements()).filter(([k]) => k !== id)));
9060
- };
9061
- const get = (id) => {
9062
- return dictionary.elements()[id] ?? null;
9063
- };
9064
- return {
9065
- ids,
9066
- elements,
9067
- has,
9068
- get,
9069
- push,
9070
- remove,
9071
- isEmpty,
9072
- firstElement,
9073
- firstId,
9074
- };
9075
- };
9076
-
9077
- const teardownsByProps = /* @__PURE__ */ new WeakMap();
9078
- const bindProps = (config) => {
9079
- const props = config.props;
9080
- const { attachEventListeners, classBindings, attributeBindings, styleBindings, staticAttributeBindings, staticClassBindings, staticStyleBindings, attached, single, name, bindId, attachedElements, } = props;
9081
- const { attributes, classes, elementRef, id, styles } = config.handlers;
9082
- const el = elementRef.nativeElement;
9083
- if (attached()) {
9084
- if (attachedElements.has(id)) {
9085
- return;
9086
- }
9087
- else if (single) {
9088
- const firstAttachedRefElement = attachedElements.first();
9089
- if (isDevMode()) {
9090
- console.error(`[${name}] These props can only be attached to a single element at a time.\n\n Already attached to \n`, firstAttachedRefElement, '\n Trying to attach to \n', el);
9091
- }
9092
- return;
9093
- }
9094
- }
9095
- attachedElements.push(id, el);
9096
- const teardowns = [];
9097
- if (bindId) {
9098
- el.id = id;
9099
- }
9100
- if (classBindings) {
9101
- const tokens = Object.keys(classBindings);
9102
- classes.pushMany(classBindings);
9103
- teardowns.push(() => classes.removeMany(tokens));
9104
- }
9105
- if (attributeBindings) {
9106
- const tokens = Object.keys(attributeBindings);
9107
- attributes.pushMany(attributeBindings);
9108
- teardowns.push(() => attributes.removeMany(tokens));
9109
- }
9110
- if (styleBindings) {
9111
- const tokens = Object.keys(styleBindings);
9112
- styles.pushMany(styleBindings);
9113
- teardowns.push(() => styles.removeMany(tokens));
9114
- }
9115
- if (staticAttributeBindings) {
9116
- const keys = Object.keys(staticAttributeBindings);
9117
- for (const key of keys) {
9118
- el.setAttribute(key, `${staticAttributeBindings[key]}`);
9119
- }
9120
- teardowns.push(() => keys.forEach((key) => el.removeAttribute(key)));
9121
- }
9122
- if (staticClassBindings) {
9123
- el.classList.add(...staticClassBindings);
9124
- teardowns.push(() => el.classList.remove(...staticClassBindings));
9125
- }
9126
- if (staticStyleBindings) {
9127
- const keys = Object.keys(staticStyleBindings);
9128
- for (const key of keys) {
9129
- el.style.setProperty(key, `${staticStyleBindings[key]}`);
9130
- }
9131
- teardowns.push(() => keys.forEach((key) => el.style.removeProperty(key)));
9132
- }
9133
- if (attachEventListeners) {
9134
- const on = ((type, listener, options) => {
9135
- el.addEventListener(type, listener, options);
9136
- teardowns.push(() => el.removeEventListener(type, listener, options));
9137
- });
9138
- attachEventListeners({ on, element: el });
9139
- }
9140
- let teardownsById = teardownsByProps.get(config.props);
9141
- if (!teardownsById) {
9142
- teardownsById = new Map();
9143
- teardownsByProps.set(config.props, teardownsById);
9144
- }
9145
- teardownsById.set(id, () => teardowns.forEach((teardown) => teardown()));
9146
- };
9147
- const unbindProps = (config) => {
9148
- const props = config.props;
9149
- const { id } = config.handlers;
9150
- const teardownsById = teardownsByProps.get(config.props);
9151
- teardownsById?.get(id)?.();
9152
- teardownsById?.delete(id);
9153
- props.attachedElements.remove(id);
9154
- };
9155
-
9156
- const createProps = (props) => {
9157
- const { bindId = false, single = true, classes: classBindings, attributes: attributeBindings, styles: styleBindings, staticAttributes: staticAttributeBindings = null, staticClasses: staticClassBindings = null, staticStyles: staticStyleBindings = null, listeners, name, } = props;
9158
- const dictionary = createElementDictionary();
9159
- const attached = computed(() => !dictionary.isEmpty(), /* @ts-ignore */
9160
- ...(ngDevMode ? [{ debugName: "attached" }] : /* istanbul ignore next */ []));
9161
- const attachedElements = {
9162
- first: dictionary.firstElement,
9163
- firstId: dictionary.firstId,
9164
- has: dictionary.has,
9165
- push: dictionary.push,
9166
- remove: dictionary.remove,
9167
- get: dictionary.get,
9168
- };
9169
- const data = {
9170
- name,
9171
- single,
9172
- bindId,
9173
- attached,
9174
- attachedElements,
9175
- classBindings: classBindings ?? null,
9176
- attributeBindings: attributeBindings ?? null,
9177
- styleBindings: styleBindings ?? null,
9178
- staticAttributeBindings,
9179
- staticClassBindings,
9180
- staticStyleBindings,
9181
- attachEventListeners: listeners ?? null,
9182
- };
9183
- return data;
9184
- };
9185
- const createHostProps = (props) => {
9186
- const data = createProps(props);
9187
- const handlers = createPropHandlers();
9188
- afterNextRender({
9189
- write: () => {
9190
- bindProps({
9191
- handlers,
9192
- props: data,
9193
- });
9194
- },
9195
- });
9196
- const destroyRef = inject(DestroyRef);
9197
- destroyRef.onDestroy(() => {
9198
- unbindProps({
9199
- handlers,
9200
- props: data,
9201
- });
9202
- });
9203
- return { props: data, handlers };
9204
- };
9205
-
9206
- const createSetup = (config) => {
9207
- let didCallSetup = false;
9208
- afterNextRender(() => {
9209
- if (!didCallSetup && isDevMode()) {
9210
- console.error('The setup() function was not called. Please call it inside your constructor.', config.this);
9211
- return;
9212
- }
9213
- });
9214
- return (params) => {
9215
- if (didCallSetup) {
9216
- if (!isDevMode())
9217
- return;
9218
- console.error('The setup() function was already called. Please call it only once. \n\n', 'Instance containing the setup() call \n', config.this, '\n\n Setup was called with\n', params);
9219
- return;
9220
- }
9221
- didCallSetup = true;
9222
- config.setupFn(params);
9223
- };
9224
- };
9225
-
9226
- const createDependencyStash = (stash) => {
9227
- const injector = inject(Injector);
9228
- const provideSignal = (data) => {
9229
- runInInjectionContext(injector, () => {
9230
- effect(() => {
9231
- stash[data.for]?.set(data.signal());
9232
- });
9233
- });
9234
- };
9235
- const provideValue = (data) => {
9236
- stash[data.for]?.set(data.value);
9237
- };
9238
- return {
9239
- ...stash,
9240
- provideSignal,
9241
- provideValue,
9242
- };
9243
- };
9244
-
9245
- class PropsDirective {
9246
- constructor() {
9247
- this.destroyRef = inject(DestroyRef);
9248
- this.props = input.required({ ...(ngDevMode ? { debugName: "props" } : /* istanbul ignore next */ {}), alias: 'etProps', transform: (d) => d });
9249
- this.propHandlers = createPropHandlers();
9250
- let boundProps = null;
9251
- effect(() => {
9252
- const props = this.props();
9253
- untracked(() => {
9254
- if (boundProps) {
9255
- unbindProps({ handlers: this.propHandlers, props: boundProps });
9256
- }
9257
- bindProps({
9258
- handlers: this.propHandlers,
9259
- props,
9260
- });
9261
- boundProps = props;
9262
- });
9263
- });
9264
- this.destroyRef.onDestroy(() => {
9265
- if (boundProps)
9266
- unbindProps({ handlers: this.propHandlers, props: boundProps });
9267
- });
9268
- }
9269
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: PropsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
9270
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: PropsDirective, isStandalone: true, selector: "[etProps]", inputs: { props: { classPropertyName: "props", publicName: "etProps", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 }); }
9271
- }
9272
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: PropsDirective, decorators: [{
9273
- type: Directive,
9274
- args: [{
9275
- selector: '[etProps]',
9276
- }]
9277
- }], ctorParameters: () => [], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "etProps", required: true }] }] } });
9278
-
9279
- const templateComputed = (templateSignal) => computed(() => {
9280
- const content = templateSignal();
9281
- if (content === null)
9282
- return null;
9283
- if (typeof content === 'string') {
9284
- return {
9285
- type: 'string',
9286
- value: content,
9287
- };
9288
- }
9289
- if (content instanceof TemplateRef) {
9290
- return {
9291
- type: 'template',
9292
- value: content,
9293
- injector: null,
9294
- };
9295
- }
9296
- if ('component' in content) {
9297
- return {
9298
- type: 'component',
9299
- value: content.component,
9300
- inputs: content.inputs,
9301
- injector: content.injector ?? null,
9302
- };
9303
- }
9304
- if ('template' in content) {
9305
- return {
9306
- type: 'template',
9307
- value: content.template,
9308
- context: content.context,
9309
- injector: content.injector ?? null,
9310
- };
9311
- }
9312
- return {
9313
- type: 'component',
9314
- value: content,
9315
- injector: null,
9316
- };
9317
- });
9318
-
9319
9079
  const EDGE_CURSORS = {
9320
9080
  n: 'ns-resize',
9321
9081
  s: 'ns-resize',
@@ -9349,7 +9109,7 @@ class ResizeHandlesComponent {
9349
9109
  ...(ngDevMode ? [{ debugName: "edges" }] : /* istanbul ignore next */ []));
9350
9110
  this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
9351
9111
  this.gestureStart$ = new Subject();
9352
- this.gesture$ = this.gestureStart$.pipe(exhaustMap(({ event, edge }) => setupResizeObservable(event, edge, this.el.nativeElement.ownerDocument)), takeUntilDestroyed(), share());
9112
+ this.gesture$ = this.gestureStart$.pipe(exhaustMap(({ event, edge }) => setupResizeObservable(event, edge, this.el.nativeElement.ownerDocument)), share(), takeUntilDestroyed());
9353
9113
  this.resizeStarted = outputFromObservable(this.gesture$.pipe(filter((e) => e.type === 'start'), map((e) => e.edge)));
9354
9114
  this.resizeMoved = outputFromObservable(this.gesture$.pipe(filter((e) => e.type === 'move'), map((e) => e.data)));
9355
9115
  this.resizeEnded = outputFromObservable(this.gesture$.pipe(filter((e) => e.type === 'end'), map(() => undefined)));
@@ -9948,6 +9708,14 @@ const injectDefaultColorTheme = () => {
9948
9708
  return theme;
9949
9709
  };
9950
9710
 
9711
+ /** Reads the nonce where Angular's default `CSP_NONCE` does, since these run outside any injector. */
9712
+ const createNoncedStyle = () => {
9713
+ const style = document.createElement('style');
9714
+ const nonce = document.body?.querySelector('[ngCspNonce]')?.getAttribute('ngCspNonce');
9715
+ if (nonce)
9716
+ style.setAttribute('nonce', nonce);
9717
+ return style;
9718
+ };
9951
9719
  /**
9952
9720
  * @deprecated Migrate to Tailwind v4. Intent to remove in v6.
9953
9721
  */
@@ -10033,7 +9801,7 @@ const createRootThemeCss = (themes) => {
10033
9801
  }
10034
9802
  `;
10035
9803
  document.getElementById('et-root-themes')?.remove();
10036
- const style = document.createElement('style');
9804
+ const style = createNoncedStyle();
10037
9805
  style.id = `et-root-themes`;
10038
9806
  style.appendChild(document.createTextNode(css));
10039
9807
  document.head.appendChild(style);
@@ -10060,7 +9828,7 @@ const createThemeStyle = (theme, isAlt) => {
10060
9828
  }
10061
9829
  `;
10062
9830
  document.getElementById(`${classPrefix}--${cssThemeName}`)?.remove();
10063
- const style = document.createElement('style');
9831
+ const style = createNoncedStyle();
10064
9832
  style.id = `${classPrefix}--${cssThemeName}`;
10065
9833
  style.appendChild(document.createTextNode(css));
10066
9834
  document.head.appendChild(style);
@@ -10306,11 +10074,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
10306
10074
 
10307
10075
  // Generated from package.json by tools/scripts/generate-version.js - do not edit.
10308
10076
  /** The version of `@ethlete/core` this build was cut from. */
10309
- const CORE_VERSION = '5.0.0-next.57';
10077
+ const CORE_VERSION = '5.0.0-next.59';
10310
10078
 
10311
10079
  /**
10312
10080
  * Generated bundle index. Do not edit.
10313
10081
  */
10314
10082
 
10315
- export { ANIMATABLE_TOKEN, ANIMATED_IF_TOKEN, ANIMATED_LIFECYCLE_TOKEN, ANIMATION_DEBUG_STORAGE_KEY, 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, MUST_MATCH, MarkdownToHtmlPipe, MatchStateType, MustMatch, NOTIFICATION_CLICK_MESSAGE_TYPE, NormalizeGameResultTypePipe, NormalizeMatchParticipantsPipe, NormalizeMatchScorePipe, NormalizeMatchStatePipe, NormalizeMatchTypePipe, OVERLAY_LAYER_ATTRIBUTE, PropsDirective, 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_TITLE_MARKER, ValidateAtLeastOneRequired, 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, bindProps, boolBreakpointTransform, boundingClientRectToElementRect, breakpointTransformBase, buildElementSignal, buildSignalEffects, canUseSessionMemory, clamp, clone, cloneFormGroup, computedTillFalsy, computedTillTruthy, controlValueSignal, controlValueSignalWithPrevious, copyToClipboard, createAnchoredPositionCleanup, createArrayPropertyBinding, createAutoSessionMemoryKey, createCanAnimateSignal, createComponentId, createCssColorThemeName, createCssSurfaceName, createDependencyStash, createDestroy, createDocumentElementSignal, createElementDictionary, createElementDimensions, createEmptyElementSignal, createFlipAnimation, createFlipAnimationGroup, createHostProps, createIsRenderedSignal, createLogger, createObjectUrlHandle, createOverlayRuntimeRef, createPropHandlers, createPropertyBinding, createProps, createRootThemeCss, createRoute, createRouterState, createRxHostListener, createSessionMemory, createSetup, 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, hasCookie, holdScrollRestoration, htmlToMarkdown, inferMimeType, initials, injectAngularRootElement, injectAnimatedBlockSize, injectAppUpdates, injectAppUpdatesConfig, injectBoundaryElement, injectBreakpointInput, injectBreakpointIsMatched, injectBreakpointObserver, injectCanHover, injectColorPalette, 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, injectQueryParamChanges, injectQueryParams, injectRenderer, injectRoute, injectRouteData, injectRouteDataItem, injectRouteTitle, injectRouterEvent, injectRouterNavigationState, injectRouterState, injectScrollbarDimensions, injectStructuredDataConfig, injectStructuredDataStore, injectStyleManager, injectSuccessTheme, injectSurfaceContextTracker, injectSurfaceThemes, injectSurfaceThemesPrefix, injectSurfaceType, injectTemplateRef, injectTitleConfig, injectTitleStore, injectUnsavedChangesCoordinator, injectUrl, injectViewportConfig, injectViewportDimensions, injectViewportSize, injectWarningTheme, isAnimationDebugEnabled, isArray, isElementSignal, isElementVisible, isFocusable, isGroupMatch, isHTMLElement, isKnockoutMatch, isObject, isOnHigherOverlayLayer, isStaleBuildError, markdownToHtml, matchesReducedMotion, maybeSignalValue, memoizeSignal, mountEasingTokens, nextFrame, normalizeGameResultType, normalizeMatchParticipant, normalizeMatchParticipants, normalizeMatchScore, normalizeMatchState, normalizeMatchType, normalizeUnsavedChangesSource, numberBreakpointTransform, onOverlayViewportInsetsChange, overlayViewportInsets, overlayViewportInsetsFor, ownsActiveElement, previousSignalValue, provideAppUpdates, provideAppUpdatesConfig, provideAppUpdatesInstance, provideBoundaryElement, provideBreakpointInstance, provideBreakpointObserver, provideColorPalette, provideColorThemes, provideColorThemesWithTailwind4, provideFaviconStore, provideFocusVisibleTracker, provideLinkStore, provideLinkStoreConfig, provideLocale, provideMetaConfig, provideMetaStore, provideNotifications, provideOverlayRuntime, provideRenderer, provideStructuredDataConfig, provideStructuredDataStore, provideStyleManager, provideSurfaceContextTracker, provideSurfaceThemesWithTailwind4, provideTitleConfig, provideTitleStore, provideUnsavedChangesCoordinator, provideViewportConfig, randomId, readBuildFingerprint, readFromClipboard, registerAnchoredPositionMiddlewareExtras, registerAnchoredPositionSetup, reserveOverlayViewportSpace, resetPositioningStyles, resolveAppRootColorProvider, resolveOverlayLayer, resolveSurfaceByElevation, round, routerDisableScrollTop, routerRestoreScroll, scrollToElement, setBackdropStyles, setBaseElementStyles, setCookie, setInputSignal, setupFocusTrap, setupPositioning, setupScrollRestoration, signalAnimatedNumber, signalAttributes, signalClasses, signalDeferredLoading, signalElementChildren, signalElementDimensions, signalElementIntersection, signalElementLastScrollDirection, signalElementMutations, signalElementScrollState, signalHostAttributes, signalHostClasses, signalHostElementDimensions, signalHostElementIntersection, signalHostElementLastScrollDirection, signalHostElementMutations, signalHostElementScrollState, signalHostStyles, signalIsRendered, signalStyles, slugify, suppressTextSelection, switchQueryListChanges, syncSignal, templateComputed, toArray, toArrayTrackByFn, toInjectFn, toProvideFn, toStringBinding, toToken, transformOrReturn, typedBreakpointTransform, unbindProps, useCursorDragScroll, writeScrollbarSizeToCssVariables, writeViewportSizeToCssVariables, ɵProvideColorThemes, ɵProvideColorThemesPrefix, ɵProvideSurfaceThemes, ɵProvideSurfaceThemesPrefix };
10083
+ export { ANIMATABLE_TOKEN, ANIMATED_IF_TOKEN, ANIMATED_LIFECYCLE_TOKEN, ANIMATION_DEBUG_STORAGE_KEY, 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, 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_TITLE_MARKER, ValidateAtLeastOneRequired, 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, createOverlayRuntimeRef, 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, hasCookie, holdScrollRestoration, htmlToMarkdown, inferMimeType, initials, injectAngularRootElement, injectAnimatedBlockSize, injectAppUpdates, injectAppUpdatesConfig, injectBoundaryElement, injectBreakpointInput, injectBreakpointIsMatched, injectBreakpointObserver, injectCanHover, injectColorPalette, 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, injectQueryParamChanges, injectQueryParams, injectRenderer, injectRoute, injectRouteData, injectRouteDataItem, injectRouteTitle, injectRouterEvent, injectRouterNavigationState, injectRouterState, injectScrollbarDimensions, injectStructuredDataConfig, injectStructuredDataStore, injectStyleManager, injectSuccessTheme, 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, isStaleBuildError, markdownToHtml, matchesReducedMotion, maybeSignalValue, memoizeSignal, mountEasingTokens, nextFrame, normalizeGameResultType, normalizeMatchParticipant, normalizeMatchParticipants, normalizeMatchScore, normalizeMatchState, normalizeMatchType, normalizeUnsavedChangesSource, numberBreakpointTransform, onOverlayViewportInsetsChange, overlayViewportInsets, overlayViewportInsetsFor, ownsActiveElement, previousSignalValue, provideAppUpdates, provideAppUpdatesConfig, provideAppUpdatesInstance, provideBoundaryElement, provideBreakpointInstance, provideBreakpointObserver, provideColorPalette, provideColorThemes, provideColorThemesWithTailwind4, provideFaviconStore, provideFocusVisibleTracker, provideLinkStore, provideLinkStoreConfig, provideLocale, provideMetaConfig, provideMetaStore, provideNotifications, provideOverlayRuntime, provideRenderer, provideStructuredDataConfig, provideStructuredDataStore, provideStyleManager, provideSurfaceContextTracker, provideSurfaceThemesWithTailwind4, provideTitleConfig, provideTitleStore, provideUnsavedChangesCoordinator, provideViewportConfig, randomId, readBuildFingerprint, readFromClipboard, registerAnchoredPositionMiddlewareExtras, registerAnchoredPositionSetup, reserveOverlayViewportSpace, resetPositioningStyles, resolveAppRootColorProvider, resolveOverlayLayer, resolveSurfaceByElevation, round, routerDisableScrollTop, routerRestoreScroll, scrollToElement, setBackdropStyles, setBaseElementStyles, 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 };
10316
10084
  //# sourceMappingURL=ethlete-core.mjs.map