@ethlete/core 5.0.0-next.27 → 5.0.0-next.29
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 +32 -0
- package/fesm2022/ethlete-core.mjs +196 -57
- package/fesm2022/ethlete-core.mjs.map +1 -1
- package/generators/tailwind-4-color-theme/generator.js +34 -7
- package/generators/tailwind-4-color-theme/schema.json +4 -0
- package/generators/tailwind-4-surface-theme/generator.js +41 -2
- package/generators/tailwind-4-surface-theme/schema.json +8 -0
- package/package.json +1 -1
- package/types/ethlete-core.d.ts +53 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,37 @@
|
|
|
1
1
|
# @ethlete/core
|
|
2
2
|
|
|
3
|
+
## 5.0.0-next.29
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`2fca323`](https://github.com/ethlete-io/ethdk/commit/2fca323a6beac0299b8e0ec6724fffd4149ad7cd) Thanks [@TomTomB](https://github.com/TomTomB)! - `injectAnimatedBlockSize` can now animate the inline axis too via the new `axes` option (`['block' | 'inline']`, static or signal-based; default `['block']` as before). Used by the cascader panel to grow/shrink its width as columns drill in and out.
|
|
8
|
+
|
|
9
|
+
- [`4b7cf51`](https://github.com/ethlete-io/ethdk/commit/4b7cf51a6f68cdaf364169945586fedc5621cad6) Thanks [@TomTomB](https://github.com/TomTomB)! - Theme generators: pick the default theme at generation time — `--defaultTheme=<name>` on `tailwind-4-color-theme` and `--defaultLightTheme=<name>` / `--defaultDarkTheme=<name>` on `tailwind-4-surface-theme` override any `isDefault` flags in the definitions, so apps sharing one theme definition set (e.g. in a monorepo) can each generate a different default.
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- [`ddb3413`](https://github.com/ethlete-io/ethdk/commit/ddb3413c2673a4f2f513598a208f376b36b7535b) Thanks [@TomTomB](https://github.com/TomTomB)! - Grid items can now be moved with touch: `[etDragHandle]` sets `touch-action: none` on its host while enabled (the browser was claiming touch pointermoves for scrolling and cancelling the gesture), and read-only grids keep normal touch scrolling.
|
|
14
|
+
|
|
15
|
+
- [`06377b6`](https://github.com/ethlete-io/ethdk/commit/06377b6312fd32c7d1f497816fa91a655bf72d19) Thanks [@TomTomB](https://github.com/TomTomB)! - Overlay: a color theme provided on the app root component (e.g. `ProvideColorDirective` via `hostDirectives` plus `forceColor()`) now propagates into overlays even when they are opened without a `viewContainerRef`, and updates reactively while the overlay is open.
|
|
16
|
+
|
|
17
|
+
## 5.0.0-next.28
|
|
18
|
+
|
|
19
|
+
### Minor Changes
|
|
20
|
+
|
|
21
|
+
- [#3022](https://github.com/ethlete-io/ethdk/pull/3022) [`9431073`](https://github.com/ethlete-io/ethdk/commit/9431073bb693aa10bbb84d5196597cb2c4b7463f) Thanks [@github-actions](https://github.com/apps/github-actions)! - Overlays and menus now open on insecure origins (plain-HTTP pages on a LAN IP, not just `localhost`/HTTPS). Id generation used `crypto.randomUUID()`, which is `undefined` outside a secure context, so opening any dialog, sheet, anchored overlay or menu threw and only the backdrop appeared. A new `randomId()` helper in `@ethlete/core` uses `crypto.randomUUID()` when available and falls back to `getRandomValues` otherwise.
|
|
22
|
+
|
|
23
|
+
- [#3022](https://github.com/ethlete-io/ethdk/pull/3022) [`9431073`](https://github.com/ethlete-io/ethdk/commit/9431073bb693aa10bbb84d5196597cb2c4b7463f) Thanks [@github-actions](https://github.com/apps/github-actions)! - Rich text editor: the link flow is now a responsive popover (arrow-anchored on wider screens, a keyboard-pinned top sheet on touch) to edit a link's text and URL, with an open-in-new-tab toggle — replacing the browser `prompt()`. New-tab links persist through the Markdown value as raw HTML (`<a target="_blank" rel="noopener noreferrer">`); ordinary links stay `[text](url)`. `htmlToMarkdown` / `markdownToHtml` in `@ethlete/core` now round-trip `target="_blank"` anchors (sanitized href + forced `rel`). After applying a link the caret moves just past it, with a trailing space added when the link ends the line.
|
|
24
|
+
|
|
25
|
+
### Patch Changes
|
|
26
|
+
|
|
27
|
+
- [#3022](https://github.com/ethlete-io/ethdk/pull/3022) [`49591f4`](https://github.com/ethlete-io/ethdk/commit/49591f4e529552fde07ef88b9754bf7c0cd91a3b) Thanks [@github-actions](https://github.com/apps/github-actions)! - `injectAnimatedBlockSize`: growing panels (menu, select) no longer flash at their final size for one frame before the resize animation plays — the animation now starts inside the `ResizeObserver` callback, before the browser paints the new layout.
|
|
28
|
+
|
|
29
|
+
- [#3022](https://github.com/ethlete-io/ethdk/pull/3022) [`d262f59`](https://github.com/ethlete-io/ethdk/commit/d262f596a4f0e3dda315447d0173cba301237c01) Thanks [@github-actions](https://github.com/apps/github-actions)! - `htmlToMarkdown`: boundary whitespace inside bold/italic/strikethrough now serializes outside the delimiters (`<strong> x</strong>` → ` **x**` instead of the invalid `** x**`).
|
|
30
|
+
|
|
31
|
+
- [#3022](https://github.com/ethlete-io/ethdk/pull/3022) [`00b7c33`](https://github.com/ethlete-io/ethdk/commit/00b7c337e5ae0ac1bfc7186237b1ac2879eb018d) Thanks [@github-actions](https://github.com/apps/github-actions)! - Theming: overlay panes (menu, select) now resolve their color context through passive providers and apply it before the first painted frame.
|
|
32
|
+
- `ProvideColorDirective` gains `resolvedColor` — the color that actually applies at the provider's location, falling through passive providers like the CSS cascade does. `syncWithProvider` uses it, so a passive in-between provider (e.g. a form field's) no longer erases the theme inside a detached overlay pane.
|
|
33
|
+
- The menu and select panels install the context sync during construction instead of in an effect, eliminating a wrong-theme flash during the enter animation.
|
|
34
|
+
|
|
3
35
|
## 5.0.0-next.27
|
|
4
36
|
|
|
5
37
|
### Minor Changes
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { InjectionToken, inject, ElementRef, Directive, assertInInjectionContext, DestroyRef, TemplateRef, QueryList, RendererFactory2, RendererStyleFlags2, isSignal, DOCUMENT, signal, linkedSignal, isDevMode, computed, afterNextRender, effect, NgZone, untracked, EnvironmentInjector, runInInjectionContext, Injector, booleanAttribute, numberAttribute, PLATFORM_ID, ApplicationRef, createComponent, model, ViewContainerRef, input, output, Pipe, ViewEncapsulation, Component } from '@angular/core';
|
|
3
3
|
import { takeUntilDestroyed, toSignal, toObservable, outputFromObservable } from '@angular/core/rxjs-interop';
|
|
4
|
-
import { Subject, BehaviorSubject, debounceTime, combineLatest, map, merge, fromEvent, filter, tap, switchMap, startWith, of, timer, takeUntil, pairwise, distinctUntilChanged, take, Observable, concatMap, EMPTY, concat,
|
|
4
|
+
import { Subject, BehaviorSubject, debounceTime, combineLatest, map, merge, fromEvent, filter, tap, switchMap, startWith, of, defer, from, catchError, timer, takeUntil, pairwise, distinctUntilChanged, take, Observable, concatMap, EMPTY, concat, exhaustMap, share } from 'rxjs';
|
|
5
5
|
import { FormGroup, FormArray, FormControl } from '@angular/forms';
|
|
6
6
|
import { SIGNAL, signalSetFn } from '@angular/core/primitives/signals';
|
|
7
7
|
import { coerceElement } from '@angular/cdk/coercion';
|
|
@@ -132,6 +132,29 @@ const createComponentId = (prefix) => {
|
|
|
132
132
|
componentIds.set(prefix, id + 1);
|
|
133
133
|
return `${prefix}-${id}`;
|
|
134
134
|
};
|
|
135
|
+
let randomIdFallbackCounter = 0;
|
|
136
|
+
/**
|
|
137
|
+
* A unique id string. Uses `crypto.randomUUID()` when available, but falls back gracefully when it is
|
|
138
|
+
* not — crucially in **insecure contexts** (a plain-HTTP page served from a LAN IP, not `localhost`),
|
|
139
|
+
* where `crypto.randomUUID` is `undefined`. Calling it there throws, so anything using it during e.g.
|
|
140
|
+
* an overlay/menu open would break on such hosts. Prefer this over `crypto.randomUUID()` directly.
|
|
141
|
+
*/
|
|
142
|
+
const randomId = () => {
|
|
143
|
+
const cryptoObj = typeof globalThis !== 'undefined' ? globalThis.crypto : undefined;
|
|
144
|
+
if (typeof cryptoObj?.randomUUID === 'function') {
|
|
145
|
+
return cryptoObj.randomUUID();
|
|
146
|
+
}
|
|
147
|
+
// `getRandomValues` is available even in insecure contexts — build an RFC-4122-ish v4 id from it.
|
|
148
|
+
if (typeof cryptoObj?.getRandomValues === 'function') {
|
|
149
|
+
const bytes = Array.from(cryptoObj.getRandomValues(new Uint8Array(16)));
|
|
150
|
+
bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40;
|
|
151
|
+
bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80;
|
|
152
|
+
const hex = bytes.map((byte) => (byte ?? 0).toString(16).padStart(2, '0'));
|
|
153
|
+
return `${hex.slice(0, 4).join('')}-${hex.slice(4, 6).join('')}-${hex.slice(6, 8).join('')}-${hex.slice(8, 10).join('')}-${hex.slice(10, 16).join('')}`;
|
|
154
|
+
}
|
|
155
|
+
// last resort: no Web Crypto at all — a session-unique (not cryptographic) id is enough for DOM ids
|
|
156
|
+
return `et-id-${(randomIdFallbackCounter++).toString(36)}-${Date.now().toString(36)}`;
|
|
157
|
+
};
|
|
135
158
|
|
|
136
159
|
const createDestroy = () => {
|
|
137
160
|
assertInInjectionContext(createDestroy);
|
|
@@ -360,32 +383,23 @@ const Validators = {
|
|
|
360
383
|
ValidateAtLeastOneRequired,
|
|
361
384
|
};
|
|
362
385
|
|
|
363
|
-
const copyToClipboard =
|
|
386
|
+
const copyToClipboard = (text) => defer(() => {
|
|
364
387
|
if (typeof navigator === 'undefined' || typeof document === 'undefined') {
|
|
365
|
-
return false;
|
|
388
|
+
return of(false);
|
|
366
389
|
}
|
|
367
390
|
if (navigator.clipboard) {
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
}
|
|
372
|
-
catch {
|
|
373
|
-
// The async Clipboard API can be blocked (missing permission, insecure context) — try the legacy path.
|
|
374
|
-
}
|
|
391
|
+
return from(navigator.clipboard.writeText(text)).pipe(map(() => true),
|
|
392
|
+
// The async Clipboard API can be blocked (missing permission, insecure context) — try the legacy path.
|
|
393
|
+
catchError(() => of(copyToClipboardViaExecCommand(text))));
|
|
375
394
|
}
|
|
376
|
-
return copyToClipboardViaExecCommand(text);
|
|
377
|
-
};
|
|
378
|
-
const readFromClipboard =
|
|
395
|
+
return of(copyToClipboardViaExecCommand(text));
|
|
396
|
+
});
|
|
397
|
+
const readFromClipboard = () => defer(() => {
|
|
379
398
|
if (typeof navigator === 'undefined' || !navigator.clipboard) {
|
|
380
|
-
return null;
|
|
381
|
-
}
|
|
382
|
-
try {
|
|
383
|
-
return await navigator.clipboard.readText();
|
|
399
|
+
return of(null);
|
|
384
400
|
}
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
}
|
|
388
|
-
};
|
|
401
|
+
return from(navigator.clipboard.readText()).pipe(catchError(() => of(null)));
|
|
402
|
+
});
|
|
389
403
|
const copyToClipboardViaExecCommand = (text) => {
|
|
390
404
|
const previouslyFocusedElement = document.activeElement;
|
|
391
405
|
const textarea = document.createElement('textarea');
|
|
@@ -1318,14 +1332,21 @@ const injectScrollbarDimensions = memoizeSignal(() => {
|
|
|
1318
1332
|
});
|
|
1319
1333
|
|
|
1320
1334
|
/**
|
|
1321
|
-
* Smoothly animates an element's `block-size`
|
|
1322
|
-
*
|
|
1323
|
-
*
|
|
1335
|
+
* Smoothly animates an element's `block-size` (and optionally `inline-size`, via `axes`) when its
|
|
1336
|
+
* content changes size (e.g. a list filtering, a loading state resolving, a column being added).
|
|
1337
|
+
* Set up once in an injection context; it observes the given content element(s) and animates the
|
|
1338
|
+
* host from its previous size to its new natural size.
|
|
1324
1339
|
*
|
|
1325
|
-
* Robustness notes: the baseline
|
|
1326
|
-
*
|
|
1327
|
-
* A change that interrupts an in-flight animation continues from the current animated
|
|
1340
|
+
* Robustness notes: the baseline size is captured on the first render (via `afterNextRender`) and
|
|
1341
|
+
* only later changes animate, so the initial layout settling never plays as a grow-from-0.
|
|
1342
|
+
* A change that interrupts an in-flight animation continues from the current animated size, and
|
|
1328
1343
|
* zero/pre-layout measurements are ignored. Respects `prefers-reduced-motion`.
|
|
1344
|
+
*
|
|
1345
|
+
* The animation starts synchronously inside the `ResizeObserver` callback — it runs after layout
|
|
1346
|
+
* but **before paint**, so the host never paints a frame at its new natural size. Routing the
|
|
1347
|
+
* resize through a signal + effect instead would apply the animation one change-detection cycle
|
|
1348
|
+
* (= one painted frame) late: a growing panel would flash at its final size, snap back, and only
|
|
1349
|
+
* then animate.
|
|
1329
1350
|
*/
|
|
1330
1351
|
const injectAnimatedBlockSize = (config) => {
|
|
1331
1352
|
const hostBinding = config.host ?? inject(ElementRef);
|
|
@@ -1334,10 +1355,12 @@ const injectAnimatedBlockSize = (config) => {
|
|
|
1334
1355
|
const destroyRef = inject(DestroyRef);
|
|
1335
1356
|
const hostSignal = firstElementSignal(buildElementSignal(hostBinding));
|
|
1336
1357
|
const observeTargets = Array.isArray(config.observe) ? config.observe : [config.observe];
|
|
1337
|
-
const
|
|
1358
|
+
const observedElements = observeTargets.map((target) => firstElementSignal(buildElementSignal(target)));
|
|
1338
1359
|
const duration = config.duration ?? 160;
|
|
1339
1360
|
const easing = config.easing ?? 'ease';
|
|
1361
|
+
const axes = () => (isSignal(config.axes) ? untracked(config.axes) : (config.axes ?? ['block']));
|
|
1340
1362
|
let lastBlockSize = null;
|
|
1363
|
+
let lastInlineSize = null;
|
|
1341
1364
|
let animation = null;
|
|
1342
1365
|
let ready = false;
|
|
1343
1366
|
const hostElement = () => hostSignal().currentElement;
|
|
@@ -1345,22 +1368,44 @@ const injectAnimatedBlockSize = (config) => {
|
|
|
1345
1368
|
const host = hostElement();
|
|
1346
1369
|
if (!host)
|
|
1347
1370
|
return;
|
|
1348
|
-
// continue from the current animated
|
|
1349
|
-
const
|
|
1371
|
+
// continue from the current animated size when interrupting a running animation
|
|
1372
|
+
const currentRect = animation?.playState === 'running' ? host.getBoundingClientRect() : null;
|
|
1373
|
+
const fromBlock = currentRect ? currentRect.height : lastBlockSize;
|
|
1374
|
+
const fromInline = currentRect ? currentRect.width : lastInlineSize;
|
|
1350
1375
|
animation?.cancel();
|
|
1351
1376
|
animation = null;
|
|
1352
|
-
const
|
|
1353
|
-
|
|
1354
|
-
|
|
1377
|
+
const targetRect = host.getBoundingClientRect();
|
|
1378
|
+
const toBlock = targetRect.height;
|
|
1379
|
+
const toInline = targetRect.width;
|
|
1380
|
+
// never record or animate a zero / pre-layout size
|
|
1381
|
+
if (toBlock === 0 || toInline === 0)
|
|
1382
|
+
return;
|
|
1383
|
+
lastBlockSize = toBlock;
|
|
1384
|
+
lastInlineSize = toInline;
|
|
1385
|
+
if (prefersReducedMotion()) {
|
|
1355
1386
|
return;
|
|
1356
|
-
|
|
1357
|
-
|
|
1387
|
+
}
|
|
1388
|
+
const activeAxes = axes();
|
|
1389
|
+
const animatesAxis = (from, to) => from !== null && from >= 1 && Math.abs(from - to) >= 1;
|
|
1390
|
+
const animateBlock = activeAxes.includes('block') && animatesAxis(fromBlock, toBlock);
|
|
1391
|
+
const animateInline = activeAxes.includes('inline') && animatesAxis(fromInline, toInline);
|
|
1392
|
+
if (!animateBlock && !animateInline) {
|
|
1358
1393
|
return;
|
|
1359
1394
|
}
|
|
1360
1395
|
if (config.resizingClass && renderer) {
|
|
1361
1396
|
renderer.addClass(host, config.resizingClass);
|
|
1362
1397
|
}
|
|
1363
|
-
const
|
|
1398
|
+
const fromFrame = {};
|
|
1399
|
+
const toFrame = {};
|
|
1400
|
+
if (animateBlock) {
|
|
1401
|
+
fromFrame['blockSize'] = `${fromBlock}px`;
|
|
1402
|
+
toFrame['blockSize'] = `${toBlock}px`;
|
|
1403
|
+
}
|
|
1404
|
+
if (animateInline) {
|
|
1405
|
+
fromFrame['inlineSize'] = `${fromInline}px`;
|
|
1406
|
+
toFrame['inlineSize'] = `${toInline}px`;
|
|
1407
|
+
}
|
|
1408
|
+
const nextAnimation = host.animate([fromFrame, toFrame], { duration, easing });
|
|
1364
1409
|
const cleanup = () => {
|
|
1365
1410
|
if (config.resizingClass && renderer) {
|
|
1366
1411
|
renderer.removeClass(host, config.resizingClass);
|
|
@@ -1372,20 +1417,35 @@ const injectAnimatedBlockSize = (config) => {
|
|
|
1372
1417
|
nextAnimation.finished.then(cleanup).catch(cleanup);
|
|
1373
1418
|
animation = nextAnimation;
|
|
1374
1419
|
};
|
|
1375
|
-
//
|
|
1420
|
+
// no zone/signal indirection — see the pre-paint timing note in the doc comment above
|
|
1421
|
+
const observer = new ResizeObserver(() => {
|
|
1422
|
+
if (!ready)
|
|
1423
|
+
return;
|
|
1424
|
+
run();
|
|
1425
|
+
});
|
|
1426
|
+
effect(() => {
|
|
1427
|
+
const elements = observedElements.map((element) => element().currentElement);
|
|
1428
|
+
untracked(() => {
|
|
1429
|
+
observer.disconnect();
|
|
1430
|
+
for (const element of elements) {
|
|
1431
|
+
if (element) {
|
|
1432
|
+
observer.observe(element);
|
|
1433
|
+
}
|
|
1434
|
+
}
|
|
1435
|
+
});
|
|
1436
|
+
});
|
|
1437
|
+
// Capture the settled size of the first render as the baseline, then only animate later changes.
|
|
1376
1438
|
afterNextRender(() => {
|
|
1377
1439
|
const host = hostElement();
|
|
1378
|
-
|
|
1440
|
+
const rect = host ? host.getBoundingClientRect() : null;
|
|
1441
|
+
lastBlockSize = rect ? rect.height || null : null;
|
|
1442
|
+
lastInlineSize = rect ? rect.width || null : null;
|
|
1379
1443
|
ready = true;
|
|
1380
1444
|
});
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
if (!ready)
|
|
1385
|
-
return;
|
|
1386
|
-
untracked(() => run());
|
|
1445
|
+
destroyRef.onDestroy(() => {
|
|
1446
|
+
observer.disconnect();
|
|
1447
|
+
animation?.cancel();
|
|
1387
1448
|
});
|
|
1388
|
-
destroyRef.onDestroy(() => animation?.cancel());
|
|
1389
1449
|
};
|
|
1390
1450
|
|
|
1391
1451
|
/**
|
|
@@ -2986,6 +3046,16 @@ const parseSeparatorAligns = (line) => parseTableRow(line).map((cell) => {
|
|
|
2986
3046
|
/** The GFM separator token for a column alignment. */
|
|
2987
3047
|
const separatorFor = (align) => align === 'center' ? ':---:' : align === 'right' ? '---:' : align === 'left' ? ':---' : '---';
|
|
2988
3048
|
const alignStyle = (align) => (align ? ` style="text-align: ${align}"` : '');
|
|
3049
|
+
/** Wraps `content` in an emphasis `marker`, hoisting boundary whitespace outside the delimiters —
|
|
3050
|
+
* CommonMark emphasis must not face whitespace on the inside (`** fett**` doesn't parse), and
|
|
3051
|
+
* ` ` counts as whitespace there too. Whitespace-only content stays unwrapped. */
|
|
3052
|
+
const emphasize = (marker, content) => {
|
|
3053
|
+
const lead = /^(?:\s| )+/i.exec(content)?.[0] ?? '';
|
|
3054
|
+
const rest = content.slice(lead.length);
|
|
3055
|
+
const trail = /(?:\s| )+$/i.exec(rest)?.[0] ?? '';
|
|
3056
|
+
const core = rest.slice(0, rest.length - trail.length);
|
|
3057
|
+
return core ? `${lead}${marker}${core}${marker}${trail}` : content;
|
|
3058
|
+
};
|
|
2989
3059
|
const makePlaceholder = (kind, idx) => `\u{E000}${kind}${idx}\u{E001}`;
|
|
2990
3060
|
const placeholderRe = (kind) => new RegExp(`\u{E000}${kind}(\\d+)\u{E001}`, 'gu');
|
|
2991
3061
|
const isPlaceholder = (kind, str) => new RegExp(`^\u{E000}${kind}\\d+\u{E001}$`, 'u').test(str);
|
|
@@ -3015,6 +3085,19 @@ const processInline = (text) => {
|
|
|
3015
3085
|
const idx = inlineCodes.push(`<code>${escapeHtml(code)}</code>`) - 1;
|
|
3016
3086
|
return makePlaceholder('IC', idx);
|
|
3017
3087
|
});
|
|
3088
|
+
// "Open in new tab" links round-trip as raw HTML because Markdown has no `target` syntax. Extract
|
|
3089
|
+
// them before the raw-HTML escape below, keeping only a safe href, `target="_blank"` and a forced
|
|
3090
|
+
// `rel="noopener noreferrer"` (any other attribute — including event handlers — is dropped); their
|
|
3091
|
+
// inner markup is processed recursively. Anything else that looks like raw HTML is still escaped.
|
|
3092
|
+
const newTabLinks = [];
|
|
3093
|
+
text = text.replace(/<a\b([^>]*)>([\s\S]*?)<\/a>/gi, (full, attrs, inner) => {
|
|
3094
|
+
const href = /\bhref\s*=\s*"([^"]*)"/i.exec(attrs)?.[1];
|
|
3095
|
+
const newTab = /\btarget\s*=\s*"_blank"/i.test(attrs);
|
|
3096
|
+
if (!newTab || !href || !isSafeUrl(href))
|
|
3097
|
+
return full;
|
|
3098
|
+
const anchor = `<a href="${href}" target="_blank" rel="noopener noreferrer">${processInline(inner)}</a>`;
|
|
3099
|
+
return makePlaceholder('NTLINK', newTabLinks.push(anchor) - 1);
|
|
3100
|
+
});
|
|
3018
3101
|
// Raw HTML in Markdown text is escaped, not rendered — the editor writes this HTML straight
|
|
3019
3102
|
// into the DOM via innerHTML, so anything else would let a crafted value inject markup. `<u>`
|
|
3020
3103
|
// is the one deliberate exception: underline has no Markdown form and round-trips as raw <u>.
|
|
@@ -3031,7 +3114,9 @@ const processInline = (text) => {
|
|
|
3031
3114
|
// Images before links (order matters); URLs with script-running schemes stay literal text
|
|
3032
3115
|
text = text.replace(/!\[([^\]]*)\]\(([^)]+)\)/g, (match, alt, src) => isSafeUrl(src) ? `<img src="${src}" alt="${alt}">` : match);
|
|
3033
3116
|
text = text.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (match, label, href) => isSafeUrl(href) ? `<a href="${href}">${label}</a>` : match);
|
|
3034
|
-
return text
|
|
3117
|
+
return text
|
|
3118
|
+
.replace(placeholderRe('IC'), (_, i) => inlineCodes[+i] ?? '')
|
|
3119
|
+
.replace(placeholderRe('NTLINK'), (_, i) => newTabLinks[+i] ?? '');
|
|
3035
3120
|
};
|
|
3036
3121
|
// --- Nested list helpers (regex can't match balanced nesting, so these scan by tag depth) ---
|
|
3037
3122
|
/** The first top-level `<ul>`/`<ol>` in `html`, matched with balanced nesting. */
|
|
@@ -3239,16 +3324,27 @@ const htmlToMarkdown = (html) => {
|
|
|
3239
3324
|
for (let i = 6; i >= 1; i--) {
|
|
3240
3325
|
md = md.replace(new RegExp(`<h${i}[^>]*>([\\s\\S]*?)<\\/h${i}>`, 'gi'), (_, content) => `\n${'#'.repeat(i)} ${content.trim()}\n`);
|
|
3241
3326
|
}
|
|
3242
|
-
// Bold + italic (combined before individual)
|
|
3243
|
-
|
|
3244
|
-
md = md.replace(/<
|
|
3245
|
-
md = md.replace(/<
|
|
3246
|
-
md = md.replace(/<(
|
|
3247
|
-
md = md.replace(/<(
|
|
3327
|
+
// Bold + italic (combined before individual). Boundary whitespace is hoisted out of the
|
|
3328
|
+
// delimiters (emphasize) — `<strong> x</strong>` must become ` **x**`, not the invalid `** x**`.
|
|
3329
|
+
md = md.replace(/<strong[^>]*><em[^>]*>([\s\S]*?)<\/em><\/strong>/gi, (_, c) => emphasize('***', c));
|
|
3330
|
+
md = md.replace(/<em[^>]*><strong[^>]*>([\s\S]*?)<\/strong><\/em>/gi, (_, c) => emphasize('***', c));
|
|
3331
|
+
md = md.replace(/<(strong|b)[^>]*>([\s\S]*?)<\/\1>/gi, (_, _tag, c) => emphasize('**', c));
|
|
3332
|
+
md = md.replace(/<(em|i)[^>]*>([\s\S]*?)<\/\1>/gi, (_, _tag, c) => emphasize('*', c));
|
|
3333
|
+
md = md.replace(/<(del|s|strike)[^>]*>([\s\S]*?)<\/\1>/gi, (_, _tag, c) => emphasize('~~', c));
|
|
3248
3334
|
// Inline code
|
|
3249
3335
|
md = md.replace(/<code[^>]*>([\s\S]*?)<\/code>/gi, (_, code) => `\`${unescapeHtml(code)}\``);
|
|
3250
|
-
// Links and images
|
|
3251
|
-
|
|
3336
|
+
// Links and images. A link with `target="_blank"` has no Markdown form, so it round-trips as raw
|
|
3337
|
+
// HTML (keeping only href + target + rel) via a placeholder — like underline below; ordinary links
|
|
3338
|
+
// become `[text](url)`.
|
|
3339
|
+
const newTabLinks = [];
|
|
3340
|
+
md = md.replace(/<a\b([^>]*)>([\s\S]*?)<\/a>/gi, (_, attrs, inner) => {
|
|
3341
|
+
const href = /\bhref\s*=\s*"([^"]*)"/i.exec(attrs)?.[1] ?? '';
|
|
3342
|
+
if (/\btarget\s*=\s*"_blank"/i.test(attrs) && href) {
|
|
3343
|
+
const anchor = `<a href="${href}" target="_blank" rel="noopener noreferrer">${inner}</a>`;
|
|
3344
|
+
return makePlaceholder('NTLINK', newTabLinks.push(anchor) - 1);
|
|
3345
|
+
}
|
|
3346
|
+
return href ? `[${inner}](${href})` : inner;
|
|
3347
|
+
});
|
|
3252
3348
|
md = md.replace(/<img[^>]+src="([^"]*)"[^>]*alt="([^"]*)"[^>]*\/?>/gi, '');
|
|
3253
3349
|
md = md.replace(/<img[^>]+alt="([^"]*)"[^>]*src="([^"]*)"[^>]*\/?>/gi, '');
|
|
3254
3350
|
md = md.replace(/<img[^>]+src="([^"]*)"[^>]*\/?>/gi, '');
|
|
@@ -3302,6 +3398,8 @@ const htmlToMarkdown = (html) => {
|
|
|
3302
3398
|
md = md.replace(/<br\s*\/?>/gi, '\n');
|
|
3303
3399
|
md = md.replace(/<hr\s*\/?>/gi, '\n---\n');
|
|
3304
3400
|
md = unescapeHtml(stripTags(md)).replace(placeholderRe('U'), (_, i) => `<u>${underlines[+i] ?? ''}</u>`);
|
|
3401
|
+
// new-tab links survive the tag-strip as raw HTML (restored after it, like underline)
|
|
3402
|
+
md = md.replace(placeholderRe('NTLINK'), (_, i) => newTabLinks[+i] ?? '');
|
|
3305
3403
|
// aligned blocks are block-level, so pad with blank lines before collapsing so they survive as
|
|
3306
3404
|
// their own Markdown block
|
|
3307
3405
|
md = md.replace(placeholderRe('ALIGN'), (_, i) => `\n\n${alignedBlocks[+i] ?? ''}\n\n`);
|
|
@@ -4692,12 +4790,18 @@ class DragHandleDirective {
|
|
|
4692
4790
|
this.gestureStart$.next(event);
|
|
4693
4791
|
}
|
|
4694
4792
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: DragHandleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
4695
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.5", type: DragHandleDirective, isStandalone: true, selector: "[etDragHandle]", inputs: { commitThreshold: { classPropertyName: "commitThreshold", publicName: "commitThreshold", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dragTapped: "dragTapped", dragStarted: "dragStarted", dragMoved: "dragMoved", dragEnded: "dragEnded" }, ngImport: i0 }); }
|
|
4793
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.5", type: DragHandleDirective, isStandalone: true, selector: "[etDragHandle]", inputs: { commitThreshold: { classPropertyName: "commitThreshold", publicName: "commitThreshold", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dragTapped: "dragTapped", dragStarted: "dragStarted", dragMoved: "dragMoved", dragEnded: "dragEnded" }, host: { properties: { "style.touch-action": "disabled() ? null : 'none'" } }, ngImport: i0 }); }
|
|
4696
4794
|
}
|
|
4697
4795
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: DragHandleDirective, decorators: [{
|
|
4698
4796
|
type: Directive,
|
|
4699
4797
|
args: [{
|
|
4700
4798
|
selector: '[etDragHandle]',
|
|
4799
|
+
host: {
|
|
4800
|
+
// Without this the browser claims touch pointermoves for scrolling and fires pointercancel,
|
|
4801
|
+
// so a touch drag never gets past the commit threshold. Scrolling stays available while the
|
|
4802
|
+
// handle is disabled.
|
|
4803
|
+
'[style.touch-action]': "disabled() ? null : 'none'",
|
|
4804
|
+
},
|
|
4701
4805
|
}]
|
|
4702
4806
|
}], ctorParameters: () => [], propDecorators: { commitThreshold: [{ type: i0.Input, args: [{ isSignal: true, alias: "commitThreshold", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], dragTapped: [{ type: i0.Output, args: ["dragTapped"] }], dragStarted: [{ type: i0.Output, args: ["dragStarted"] }], dragMoved: [{ type: i0.Output, args: ["dragMoved"] }], dragEnded: [{ type: i0.Output, args: ["dragEnded"] }] } });
|
|
4703
4807
|
|
|
@@ -7694,12 +7798,31 @@ const provideColorThemes = (themes) => {
|
|
|
7694
7798
|
};
|
|
7695
7799
|
|
|
7696
7800
|
const COLOR_PROVIDER = new InjectionToken('ColorProvider');
|
|
7801
|
+
/**
|
|
7802
|
+
* The color provider attached to a bootstrapped root component (e.g. `ProvideColorDirective` in
|
|
7803
|
+
* the app component's `hostDirectives`), if any. Detached DOM such as overlay panes can't reach
|
|
7804
|
+
* it through element DI, so overlay containers fall back to this when resolving the provider to
|
|
7805
|
+
* `syncWithProvider()` — resolve at sync time, not at injection time, since root components only
|
|
7806
|
+
* register with `ApplicationRef` once bootstrap completes.
|
|
7807
|
+
*
|
|
7808
|
+
* @internal
|
|
7809
|
+
*/
|
|
7810
|
+
const resolveAppRootColorProvider = (appRef) => {
|
|
7811
|
+
for (const componentRef of appRef.components) {
|
|
7812
|
+
const provider = componentRef.injector.get(COLOR_PROVIDER, null);
|
|
7813
|
+
if (provider) {
|
|
7814
|
+
return provider;
|
|
7815
|
+
}
|
|
7816
|
+
}
|
|
7817
|
+
return null;
|
|
7818
|
+
};
|
|
7697
7819
|
const FORCED_COLOR_UNSET = Symbol('FORCED_COLOR_UNSET');
|
|
7698
7820
|
class ProvideColorDirective {
|
|
7699
7821
|
constructor() {
|
|
7700
7822
|
this.themes = injectColorThemes({ optional: true });
|
|
7701
7823
|
this.prefix = injectColorThemesPrefix({ optional: true });
|
|
7702
7824
|
this.injector = inject(Injector);
|
|
7825
|
+
this.parentProvider = inject(COLOR_PROVIDER, { optional: true, skipSelf: true });
|
|
7703
7826
|
this.currentProviderSync = null;
|
|
7704
7827
|
this.forcedColor = signal(FORCED_COLOR_UNSET, /* @ts-ignore */
|
|
7705
7828
|
...(ngDevMode ? [{ debugName: "forcedColor" }] : /* istanbul ignore next */ []));
|
|
@@ -7712,6 +7835,22 @@ class ProvideColorDirective {
|
|
|
7712
7835
|
return this.color();
|
|
7713
7836
|
}, /* @ts-ignore */
|
|
7714
7837
|
...(ngDevMode ? [{ debugName: "effectiveColor" }] : /* istanbul ignore next */ []));
|
|
7838
|
+
/**
|
|
7839
|
+
* The color that actually applies at this provider's location: its own effective color, or —
|
|
7840
|
+
* when this provider is passive (no input, nothing forced) — the nearest ancestor provider's.
|
|
7841
|
+
* Mirrors the CSS cascade, which falls through a provider's `-color--inherited` scope class;
|
|
7842
|
+
* consumers that re-apply context across detached DOM (overlay panes) must use this instead
|
|
7843
|
+
* of `effectiveColor` or a passive in-between provider (e.g. a form field's) erases the theme.
|
|
7844
|
+
*/
|
|
7845
|
+
this.resolvedColor = computed(() => {
|
|
7846
|
+
const own = this.effectiveColor();
|
|
7847
|
+
const ownName = typeof own === 'object' && own !== null ? own.name : own;
|
|
7848
|
+
if (ownName) {
|
|
7849
|
+
return own;
|
|
7850
|
+
}
|
|
7851
|
+
return this.parentProvider?.resolvedColor();
|
|
7852
|
+
}, /* @ts-ignore */
|
|
7853
|
+
...(ngDevMode ? [{ debugName: "resolvedColor" }] : /* istanbul ignore next */ []));
|
|
7715
7854
|
this.colorName = computed(() => {
|
|
7716
7855
|
const raw = this.effectiveColor();
|
|
7717
7856
|
const value = typeof raw === 'object' && raw !== null ? raw.name : raw;
|
|
@@ -7736,7 +7875,7 @@ class ProvideColorDirective {
|
|
|
7736
7875
|
this.currentProviderSync?.destroy();
|
|
7737
7876
|
runInInjectionContext(this.injector, () => {
|
|
7738
7877
|
this.currentProviderSync = effect(() => {
|
|
7739
|
-
const provideColor = provider.
|
|
7878
|
+
const provideColor = provider.resolvedColor();
|
|
7740
7879
|
untracked(() => {
|
|
7741
7880
|
if (provideColor === undefined) {
|
|
7742
7881
|
this.clearForcedColor();
|
|
@@ -7847,5 +7986,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
7847
7986
|
* Generated bundle index. Do not edit.
|
|
7848
7987
|
*/
|
|
7849
7988
|
|
|
7850
|
-
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 as JsonLD, KeyPressManager, MUST_MATCH, MarkdownToHtmlPipe, MustMatch, NormalizeGameResultTypePipe, NormalizeMatchParticipantsPipe, NormalizeMatchScorePipe, NormalizeMatchStatePipe, NormalizeMatchTypePipe, PropsDirective, ProvideColorDirective, ProvideSurfaceDirective, RUNTIME_ERROR_NO_DATA, RepeatDirective, ResizeHandlesComponent, RuntimeError, SEO_DIRECTIVE_TOKEN, SURFACE_PROVIDER, SURFACE_TYPE, ScrollObserverDirective, ScrollObserverEndDirective, ScrollObserverStartDirective, SeoDirective, 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, 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, numberBreakpointAttribute, numberBreakpointTransform, previousSignalValue, provideBoundaryElement, provideBreakpointInstance, provideBreakpointObserver, provideColorThemes, provideColorThemesWithTailwind4, provideFocusVisibleTracker, provideLinkStore, provideLinkStoreConfig, provideLocale, provideMetaConfig, provideMetaStore, provideOverlayRuntime, provideRenderer, provideStructuredDataConfig, provideStructuredDataStore, provideStyleManager, provideSurfaceContextTracker, provideSurfaceThemesWithTailwind4, provideTitleConfig, provideTitleStore, provideViewportConfig, readFromClipboard, resetPositioningStyles, resolveSurfaceByElevation, round, routerDisableScrollTop, scrollToElement, setBackdropStyles, setBaseElementStyles, setCookie, setInputSignal, setupFocusTrap, setupPositioning, setupScrollRestoration, signalAnimatedNumber, signalAttributes, signalClasses, signalElementChildren, signalElementDimensions, signalElementIntersection, signalElementLastScrollDirection, signalElementMutations, signalElementScrollState, signalHostAttributes, signalHostClasses, signalHostElementDimensions, signalHostElementIntersection, signalHostElementLastScrollDirection, signalHostElementMutations, signalHostElementScrollState, signalHostStyles, signalIsRendered, signalStyles, slugify, switchQueryListChanges, syncSignal, templateComputed, toArray, toArrayTrackByFn, toStringBinding, transformOrReturn, typedBreakpointTransform, unbindProps, useCursorDragScroll, writeScrollbarSizeToCssVariables, writeViewportSizeToCssVariables, ɵProvideColorThemes, ɵProvideColorThemesPrefix, ɵProvideSurfaceThemes, ɵProvideSurfaceThemesPrefix };
|
|
7989
|
+
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 as JsonLD, KeyPressManager, MUST_MATCH, MarkdownToHtmlPipe, MustMatch, NormalizeGameResultTypePipe, NormalizeMatchParticipantsPipe, NormalizeMatchScorePipe, NormalizeMatchStatePipe, NormalizeMatchTypePipe, PropsDirective, ProvideColorDirective, ProvideSurfaceDirective, RUNTIME_ERROR_NO_DATA, RepeatDirective, ResizeHandlesComponent, RuntimeError, SEO_DIRECTIVE_TOKEN, SURFACE_PROVIDER, SURFACE_TYPE, ScrollObserverDirective, ScrollObserverEndDirective, ScrollObserverStartDirective, SeoDirective, 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, 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, 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 };
|
|
7851
7990
|
//# sourceMappingURL=ethlete-core.mjs.map
|