@acorex/core 22.1.0-next.31 → 22.1.0-next.33
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/constants/README.md +7 -1
- package/fesm2022/acorex-core-components.mjs +3 -3
- package/fesm2022/acorex-core-config.mjs +3 -3
- package/fesm2022/acorex-core-constants.mjs +27809 -1
- package/fesm2022/acorex-core-constants.mjs.map +1 -1
- package/fesm2022/acorex-core-date-time.mjs +55 -41
- package/fesm2022/acorex-core-date-time.mjs.map +1 -1
- package/fesm2022/acorex-core-events.mjs +3 -3
- package/fesm2022/acorex-core-file.mjs +53 -46
- package/fesm2022/acorex-core-file.mjs.map +1 -1
- package/fesm2022/acorex-core-format.mjs +19 -19
- package/fesm2022/acorex-core-full-screen.mjs +232 -59
- package/fesm2022/acorex-core-full-screen.mjs.map +1 -1
- package/fesm2022/acorex-core-icon.mjs +3 -3
- package/fesm2022/acorex-core-image.mjs +3 -3
- package/fesm2022/acorex-core-locale.mjs +13 -10
- package/fesm2022/acorex-core-locale.mjs.map +1 -1
- package/fesm2022/acorex-core-network.mjs +3 -3
- package/fesm2022/acorex-core-pipes.mjs +3 -3
- package/fesm2022/acorex-core-platform.mjs +4 -3
- package/fesm2022/acorex-core-platform.mjs.map +1 -1
- package/fesm2022/acorex-core-storage.mjs +9 -9
- package/fesm2022/acorex-core-theme-builder.mjs +1329 -0
- package/fesm2022/acorex-core-theme-builder.mjs.map +1 -0
- package/fesm2022/acorex-core-translation.mjs +36 -24
- package/fesm2022/acorex-core-translation.mjs.map +1 -1
- package/fesm2022/acorex-core-utils.mjs +256 -80
- package/fesm2022/acorex-core-utils.mjs.map +1 -1
- package/fesm2022/acorex-core-validation.mjs +40 -40
- package/fesm2022/acorex-core-z-index.mjs +3 -3
- package/i18n/en-AU/acorex.json +1101 -0
- package/i18n/en-AU/common.json +290 -0
- package/i18n/en-US/acorex.json +1101 -0
- package/i18n/en-US/common.json +285 -0
- package/i18n/fa-IR/acorex.json +1101 -0
- package/i18n/fa-IR/common.json +284 -0
- package/package.json +8 -2
- package/theme-builder/README.md +53 -0
- package/types/acorex-core-components.d.ts +1 -1
- package/types/acorex-core-config.d.ts +1 -1
- package/types/acorex-core-constants.d.ts +58 -2
- package/types/acorex-core-date-time.d.ts +9 -4
- package/types/acorex-core-events.d.ts +1 -1
- package/types/acorex-core-file.d.ts +12 -11
- package/types/acorex-core-format.d.ts +3 -3
- package/types/acorex-core-full-screen.d.ts +67 -18
- package/types/acorex-core-icon.d.ts +1 -1
- package/types/acorex-core-image.d.ts +1 -1
- package/types/acorex-core-locale.d.ts +4 -2
- package/types/acorex-core-network.d.ts +1 -1
- package/types/acorex-core-platform.d.ts +1 -1
- package/types/acorex-core-storage.d.ts +3 -3
- package/types/acorex-core-theme-builder.d.ts +42 -0
- package/types/acorex-core-translation.d.ts +12 -6
- package/types/acorex-core-utils.d.ts +54 -16
- package/types/acorex-core-validation.d.ts +12 -12
- package/types/acorex-core-z-index.d.ts +1 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import tinycolor from 'tinycolor2';
|
|
2
2
|
import tinygradient from 'tinygradient-es';
|
|
3
|
+
import { DOCUMENT, isPlatformBrowser } from '@angular/common';
|
|
3
4
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { Injectable } from '@angular/core';
|
|
5
|
+
import { inject, PLATFORM_ID, Injectable } from '@angular/core';
|
|
5
6
|
import { isBrowser } from '@acorex/core/platform';
|
|
6
7
|
import { Subject, takeUntil } from 'rxjs';
|
|
7
8
|
|
|
@@ -303,125 +304,300 @@ async function fallbackChain(tasks) {
|
|
|
303
304
|
throw lastError ?? new Error('All fallback tasks failed');
|
|
304
305
|
}
|
|
305
306
|
|
|
306
|
-
const
|
|
307
|
-
const
|
|
308
|
-
const
|
|
307
|
+
const DEFAULT_HIGHLIGHT_TEXT_CLASS = 'ax-highlight-text';
|
|
308
|
+
const DEFAULT_HIGHLIGHT_MATCH_CLASS = 'ax-highlight';
|
|
309
|
+
const DEFAULT_IGNORED_PARENT_TAGS = new Set([
|
|
310
|
+
'SCRIPT',
|
|
311
|
+
'STYLE',
|
|
312
|
+
'TEXTAREA',
|
|
313
|
+
'INPUT',
|
|
314
|
+
'SELECT',
|
|
315
|
+
'OPTION',
|
|
316
|
+
'NOSCRIPT',
|
|
317
|
+
]);
|
|
309
318
|
/**
|
|
310
319
|
* Service for applying and resetting text highlighting within specified HTML elements.
|
|
311
320
|
*/
|
|
312
321
|
class AXHighlightService {
|
|
313
322
|
constructor() {
|
|
314
|
-
this.
|
|
315
|
-
this.
|
|
323
|
+
this.document = inject(DOCUMENT);
|
|
324
|
+
this.platformId = inject(PLATFORM_ID);
|
|
325
|
+
this.selectorStates = new Map();
|
|
326
|
+
this.elementStates = new WeakMap();
|
|
327
|
+
this.trackedElements = new Set();
|
|
316
328
|
}
|
|
317
329
|
/**
|
|
318
|
-
* Highlights all occurrences of a search value within the elements matching the provided
|
|
330
|
+
* Highlights all occurrences of a search value within the elements matching the provided target.
|
|
319
331
|
*
|
|
320
|
-
* @param
|
|
321
|
-
* @param
|
|
332
|
+
* @param target - CSS selector, a single element, or an array of elements to search within.
|
|
333
|
+
* @param term - Text or list of texts to search and highlight.
|
|
334
|
+
* @param options - Optional highlight behavior configuration.
|
|
335
|
+
* @returns The number of matches highlighted.
|
|
322
336
|
*/
|
|
323
|
-
highlight(
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
return;
|
|
337
|
+
highlight(target, term, options) {
|
|
338
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
339
|
+
return 0;
|
|
327
340
|
}
|
|
328
|
-
this.
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
341
|
+
const terms = this.normalizeTerms(term);
|
|
342
|
+
const resolvedOptions = this.resolveOptions(options);
|
|
343
|
+
if (!terms.length) {
|
|
344
|
+
this.clear(target);
|
|
345
|
+
return 0;
|
|
346
|
+
}
|
|
347
|
+
const roots = this.resolveRoots(target);
|
|
348
|
+
if (!roots.length) {
|
|
349
|
+
return 0;
|
|
350
|
+
}
|
|
351
|
+
this.clear(target);
|
|
352
|
+
this.registerState(target, resolvedOptions);
|
|
353
|
+
const searchRegex = this.createSearchRegex(terms, resolvedOptions);
|
|
354
|
+
let matchCount = 0;
|
|
355
|
+
for (const root of roots) {
|
|
356
|
+
if (matchCount >= resolvedOptions.maxMatches) {
|
|
357
|
+
break;
|
|
358
|
+
}
|
|
359
|
+
const textNodes = this.collectTextNodes(root, resolvedOptions);
|
|
360
|
+
for (const textNode of textNodes) {
|
|
361
|
+
if (matchCount >= resolvedOptions.maxMatches) {
|
|
362
|
+
break;
|
|
363
|
+
}
|
|
364
|
+
const added = this.highlightTextNode(textNode, searchRegex, resolvedOptions, resolvedOptions.maxMatches - matchCount);
|
|
365
|
+
matchCount += added;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return matchCount;
|
|
336
369
|
}
|
|
337
370
|
/**
|
|
338
|
-
* Resets highlighted text within the elements matching the
|
|
371
|
+
* Resets highlighted text within the elements matching the target.
|
|
372
|
+
* When no target is provided, clears all highlights registered by this service.
|
|
339
373
|
*
|
|
340
|
-
* @param
|
|
374
|
+
* @param target - CSS selector, element, or elements to clear.
|
|
341
375
|
*/
|
|
342
|
-
clear(
|
|
343
|
-
|
|
344
|
-
if (!selector) {
|
|
376
|
+
clear(target) {
|
|
377
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
345
378
|
return;
|
|
346
379
|
}
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
this.
|
|
380
|
+
if (target === undefined) {
|
|
381
|
+
for (const selector of [...this.selectorStates.keys()]) {
|
|
382
|
+
this.clearSelector(selector, this.selectorStates.get(selector));
|
|
383
|
+
}
|
|
384
|
+
this.selectorStates.clear();
|
|
385
|
+
for (const element of [...this.trackedElements]) {
|
|
386
|
+
this.clearElement(element, this.elementStates.get(element));
|
|
387
|
+
}
|
|
388
|
+
this.trackedElements.clear();
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
if (typeof target === 'string') {
|
|
392
|
+
const options = this.selectorStates.get(target) ?? this.resolveOptions();
|
|
393
|
+
this.clearSelector(target, options);
|
|
394
|
+
this.selectorStates.delete(target);
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
const elements = this.toElementArray(target);
|
|
398
|
+
for (const element of elements) {
|
|
399
|
+
const options = this.elementStates.get(element) ?? this.resolveOptions();
|
|
400
|
+
this.clearElement(element, options);
|
|
401
|
+
this.elementStates.delete(element);
|
|
402
|
+
this.trackedElements.delete(element);
|
|
360
403
|
}
|
|
361
404
|
}
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
405
|
+
toElementArray(target) {
|
|
406
|
+
if (Array.isArray(target)) {
|
|
407
|
+
return [...target];
|
|
408
|
+
}
|
|
409
|
+
return [target];
|
|
410
|
+
}
|
|
411
|
+
normalizeTerms(term) {
|
|
412
|
+
const terms = Array.isArray(term) ? term : [term];
|
|
413
|
+
return terms.map((value) => value.trim()).filter(Boolean);
|
|
414
|
+
}
|
|
415
|
+
resolveOptions(options) {
|
|
416
|
+
return {
|
|
417
|
+
caseSensitive: options?.caseSensitive ?? false,
|
|
418
|
+
wholeWord: options?.wholeWord ?? false,
|
|
419
|
+
maxMatches: options?.maxMatches ?? Number.POSITIVE_INFINITY,
|
|
420
|
+
highlightClass: options?.highlightClass ?? DEFAULT_HIGHLIGHT_MATCH_CLASS,
|
|
421
|
+
wrapperClass: options?.wrapperClass ?? DEFAULT_HIGHLIGHT_TEXT_CLASS,
|
|
422
|
+
ignoredTags: new Set(options?.ignoredTags ?? DEFAULT_IGNORED_PARENT_TAGS),
|
|
423
|
+
};
|
|
365
424
|
}
|
|
366
|
-
|
|
367
|
-
|
|
425
|
+
registerState(target, options) {
|
|
426
|
+
if (typeof target === 'string') {
|
|
427
|
+
this.selectorStates.set(target, options);
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
const elements = this.toElementArray(target);
|
|
431
|
+
for (const element of elements) {
|
|
432
|
+
this.elementStates.set(element, options);
|
|
433
|
+
this.trackedElements.add(element);
|
|
434
|
+
}
|
|
368
435
|
}
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
436
|
+
resolveRoots(target) {
|
|
437
|
+
if (typeof target === 'string') {
|
|
438
|
+
if (!target) {
|
|
439
|
+
return [];
|
|
440
|
+
}
|
|
441
|
+
return Array.from(this.document.querySelectorAll(target));
|
|
442
|
+
}
|
|
443
|
+
return this.toElementArray(target);
|
|
444
|
+
}
|
|
445
|
+
createSearchRegex(terms, options) {
|
|
446
|
+
const escaped = [...terms]
|
|
447
|
+
.sort((left, right) => right.length - left.length)
|
|
448
|
+
.map((term) => term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
|
|
449
|
+
const pattern = options.wholeWord ? `\\b(?:${escaped.join('|')})\\b` : `(?:${escaped.join('|')})`;
|
|
450
|
+
const flags = options.caseSensitive ? 'g' : 'gi';
|
|
451
|
+
return new RegExp(`(${pattern})`, flags);
|
|
452
|
+
}
|
|
453
|
+
collectTextNodes(root, options) {
|
|
454
|
+
const textNodes = [];
|
|
455
|
+
const walker = this.document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {
|
|
456
|
+
acceptNode: (node) => {
|
|
457
|
+
const textNode = node;
|
|
458
|
+
const parent = textNode.parentElement;
|
|
459
|
+
if (!parent) {
|
|
460
|
+
return NodeFilter.FILTER_REJECT;
|
|
376
461
|
}
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
if (searchRegex.test(textContent)) {
|
|
380
|
-
const highlightedHtml = this.createHighlightedHTML(textContent, searchRegex);
|
|
381
|
-
const tempContainer = document.createElement('div');
|
|
382
|
-
tempContainer.innerHTML = highlightedHtml;
|
|
383
|
-
const fragment = document.createDocumentFragment();
|
|
384
|
-
Array.from(tempContainer.childNodes).forEach((child) => fragment.appendChild(child));
|
|
385
|
-
node.replaceWith(fragment);
|
|
462
|
+
if (parent.classList.contains(options.wrapperClass)) {
|
|
463
|
+
return NodeFilter.FILTER_REJECT;
|
|
386
464
|
}
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
465
|
+
if (options.ignoredTags.has(parent.tagName)) {
|
|
466
|
+
return NodeFilter.FILTER_REJECT;
|
|
467
|
+
}
|
|
468
|
+
if (parent.closest('[contenteditable="true"]')) {
|
|
469
|
+
return NodeFilter.FILTER_REJECT;
|
|
470
|
+
}
|
|
471
|
+
const content = textNode.textContent ?? '';
|
|
472
|
+
return content.length > 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
|
|
473
|
+
},
|
|
392
474
|
});
|
|
475
|
+
let current = walker.nextNode();
|
|
476
|
+
while (current) {
|
|
477
|
+
textNodes.push(current);
|
|
478
|
+
current = walker.nextNode();
|
|
479
|
+
}
|
|
480
|
+
return textNodes;
|
|
393
481
|
}
|
|
394
|
-
|
|
482
|
+
highlightTextNode(textNode, searchRegex, options, remainingMatches) {
|
|
483
|
+
const textContent = textNode.textContent ?? '';
|
|
484
|
+
searchRegex.lastIndex = 0;
|
|
485
|
+
if (!searchRegex.test(textContent) || remainingMatches <= 0) {
|
|
486
|
+
return 0;
|
|
487
|
+
}
|
|
488
|
+
const fragment = this.document.createDocumentFragment();
|
|
489
|
+
const wrapper = this.document.createElement('span');
|
|
490
|
+
wrapper.classList.add(options.wrapperClass);
|
|
395
491
|
let lastIndex = 0;
|
|
396
|
-
let
|
|
492
|
+
let matchCount = 0;
|
|
397
493
|
let match;
|
|
398
494
|
searchRegex.lastIndex = 0;
|
|
399
|
-
while ((match = searchRegex.exec(textContent)) !== null) {
|
|
495
|
+
while ((match = searchRegex.exec(textContent)) !== null && matchCount < remainingMatches) {
|
|
400
496
|
if (match.index > lastIndex) {
|
|
401
|
-
|
|
497
|
+
wrapper.appendChild(this.document.createTextNode(textContent.slice(lastIndex, match.index)));
|
|
402
498
|
}
|
|
403
|
-
|
|
499
|
+
const matchSpan = this.document.createElement('span');
|
|
500
|
+
matchSpan.classList.add(options.highlightClass);
|
|
501
|
+
matchSpan.textContent = match[0];
|
|
502
|
+
wrapper.appendChild(matchSpan);
|
|
404
503
|
lastIndex = searchRegex.lastIndex;
|
|
504
|
+
matchCount++;
|
|
405
505
|
if (match[0].length === 0) {
|
|
406
506
|
searchRegex.lastIndex++;
|
|
407
507
|
}
|
|
408
508
|
}
|
|
509
|
+
if (matchCount === 0) {
|
|
510
|
+
return 0;
|
|
511
|
+
}
|
|
409
512
|
if (lastIndex < textContent.length) {
|
|
410
|
-
|
|
513
|
+
wrapper.appendChild(this.document.createTextNode(textContent.slice(lastIndex)));
|
|
514
|
+
}
|
|
515
|
+
fragment.appendChild(wrapper);
|
|
516
|
+
textNode.replaceWith(fragment);
|
|
517
|
+
return matchCount;
|
|
518
|
+
}
|
|
519
|
+
clearSelector(selector, options) {
|
|
520
|
+
const wrappers = this.document.querySelectorAll(`${selector} .${options.wrapperClass}`);
|
|
521
|
+
wrappers.forEach((wrapper) => this.unwrapHighlight(wrapper));
|
|
522
|
+
}
|
|
523
|
+
clearElement(element, options) {
|
|
524
|
+
const wrapperClass = options?.wrapperClass ?? DEFAULT_HIGHLIGHT_TEXT_CLASS;
|
|
525
|
+
const wrappers = element.querySelectorAll(`.${wrapperClass}`);
|
|
526
|
+
wrappers.forEach((wrapper) => this.unwrapHighlight(wrapper));
|
|
527
|
+
}
|
|
528
|
+
unwrapHighlight(wrapper) {
|
|
529
|
+
const parent = wrapper.parentNode;
|
|
530
|
+
if (!parent) {
|
|
531
|
+
return;
|
|
411
532
|
}
|
|
412
|
-
|
|
413
|
-
|
|
533
|
+
const textNode = this.document.createTextNode(wrapper.textContent ?? '');
|
|
534
|
+
parent.replaceChild(textNode, wrapper);
|
|
535
|
+
parent.normalize();
|
|
414
536
|
}
|
|
415
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
416
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.
|
|
537
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AXHighlightService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
538
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AXHighlightService, providedIn: 'root' }); }
|
|
417
539
|
}
|
|
418
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
540
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AXHighlightService, decorators: [{
|
|
419
541
|
type: Injectable,
|
|
420
542
|
args: [{
|
|
421
543
|
providedIn: 'root',
|
|
422
544
|
}]
|
|
423
545
|
}] });
|
|
424
546
|
|
|
547
|
+
function normalizeTerms(term) {
|
|
548
|
+
const terms = Array.isArray(term) ? term : [term];
|
|
549
|
+
return terms.map((value) => value.trim()).filter(Boolean);
|
|
550
|
+
}
|
|
551
|
+
function resolveSegmentOptions(options) {
|
|
552
|
+
return {
|
|
553
|
+
caseSensitive: options?.caseSensitive ?? false,
|
|
554
|
+
wholeWord: options?.wholeWord ?? false,
|
|
555
|
+
};
|
|
556
|
+
}
|
|
557
|
+
function createHighlightSearchRegex(terms, options) {
|
|
558
|
+
const escaped = [...terms]
|
|
559
|
+
.sort((left, right) => right.length - left.length)
|
|
560
|
+
.map((term) => term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
|
|
561
|
+
const pattern = options.wholeWord ? `\\b(?:${escaped.join('|')})\\b` : `(?:${escaped.join('|')})`;
|
|
562
|
+
const flags = options.caseSensitive ? 'g' : 'gi';
|
|
563
|
+
return new RegExp(`(${pattern})`, flags);
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Splits text into highlighted and non-highlighted segments for template rendering.
|
|
567
|
+
* Uses the same matching semantics as {@link AXHighlightService}.
|
|
568
|
+
*/
|
|
569
|
+
function splitHighlightSegments(text, term, options) {
|
|
570
|
+
const content = text ?? '';
|
|
571
|
+
const terms = normalizeTerms(term);
|
|
572
|
+
if (!terms.length || !content) {
|
|
573
|
+
return content ? [{ text: content, match: false }] : [];
|
|
574
|
+
}
|
|
575
|
+
const resolvedOptions = resolveSegmentOptions(options);
|
|
576
|
+
const searchRegex = createHighlightSearchRegex(terms, resolvedOptions);
|
|
577
|
+
searchRegex.lastIndex = 0;
|
|
578
|
+
if (!searchRegex.test(content)) {
|
|
579
|
+
return [{ text: content, match: false }];
|
|
580
|
+
}
|
|
581
|
+
const segments = [];
|
|
582
|
+
let lastIndex = 0;
|
|
583
|
+
let match;
|
|
584
|
+
searchRegex.lastIndex = 0;
|
|
585
|
+
while ((match = searchRegex.exec(content)) !== null) {
|
|
586
|
+
if (match.index > lastIndex) {
|
|
587
|
+
segments.push({ text: content.slice(lastIndex, match.index), match: false });
|
|
588
|
+
}
|
|
589
|
+
segments.push({ text: match[0], match: true });
|
|
590
|
+
lastIndex = searchRegex.lastIndex;
|
|
591
|
+
if (match[0].length === 0) {
|
|
592
|
+
searchRegex.lastIndex++;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
if (lastIndex < content.length) {
|
|
596
|
+
segments.push({ text: content.slice(lastIndex), match: false });
|
|
597
|
+
}
|
|
598
|
+
return segments.length > 0 ? segments : [{ text: content, match: false }];
|
|
599
|
+
}
|
|
600
|
+
|
|
425
601
|
/** ACoreX layout size classes applied on a host or container. */
|
|
426
602
|
const AX_SIZE_CLASSES = ['ax-xs', 'ax-sm', 'ax-md', 'ax-lg', 'ax-xl'];
|
|
427
603
|
class AXHtmlUtil {
|
|
@@ -521,10 +697,10 @@ class AXUnsubscriber {
|
|
|
521
697
|
ngOnDestroy() {
|
|
522
698
|
this.unsubscribe();
|
|
523
699
|
}
|
|
524
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
525
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.
|
|
700
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AXUnsubscriber, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
701
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AXUnsubscriber }); }
|
|
526
702
|
}
|
|
527
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
703
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AXUnsubscriber, decorators: [{
|
|
528
704
|
type: Injectable
|
|
529
705
|
}] });
|
|
530
706
|
|
|
@@ -548,5 +724,5 @@ function getWordBoundsAtPosition(str, position) {
|
|
|
548
724
|
* Generated bundle index. Do not edit.
|
|
549
725
|
*/
|
|
550
726
|
|
|
551
|
-
export { AXAutoUnsubscriber, AXColorUtil, AXDrawingUtil, AXHighlightService, AXHtmlUtil, AXUnsubscriber, AX_SIZE_CLASSES, debounceAsync, delay, fallbackChain, getWordBoundsAtPosition, pollUntil, pollUntilAbortable, retryUntil, throttleAsync, waitFor };
|
|
727
|
+
export { AXAutoUnsubscriber, AXColorUtil, AXDrawingUtil, AXHighlightService, AXHtmlUtil, AXUnsubscriber, AX_SIZE_CLASSES, debounceAsync, delay, fallbackChain, getWordBoundsAtPosition, pollUntil, pollUntilAbortable, retryUntil, splitHighlightSegments, throttleAsync, waitFor };
|
|
552
728
|
//# sourceMappingURL=acorex-core-utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-core-utils.mjs","sources":["../../../../packages/core/utils/src/lib/color.utils.ts","../../../../packages/core/utils/src/lib/drawing.utils.ts","../../../../packages/core/utils/src/lib/execution.utils.ts","../../../../packages/core/utils/src/lib/highlight.service.ts","../../../../packages/core/utils/src/lib/html-utils.ts","../../../../packages/core/utils/src/lib/lifecycle-helpers.utils.ts","../../../../packages/core/utils/src/lib/string.utils.ts","../../../../packages/core/utils/src/acorex-core-utils.ts"],"sourcesContent":["export type AXColorMode = 'rgba' | 'hex' | 'hsla' | 'hsva' | null;\n\nimport tinycolor, { ColorInput } from 'tinycolor2';\nimport tinygradient, { Instance } from 'tinygradient-es';\n\nexport type AXColorFormat = ColorInput;\n\nexport class AXColorUtil {\n static to(color: AXColorFormat, mode: AXColorMode): AXColorFormat {\n const _color = tinycolor(color);\n switch (mode) {\n case 'rgba':\n return _color.toRgb();\n case 'hsla':\n return _color.toHsl();\n case 'hsva':\n return _color.toHsv();\n default:\n return _color.toHex();\n }\n }\n\n static toString(color: AXColorFormat, mode: AXColorMode = null): string {\n const _color = tinycolor(color);\n switch (mode) {\n case 'rgba':\n return _color.toRgbString();\n case 'hsla':\n return _color.toHslString();\n case 'hsva':\n return _color.toHsvString();\n\n case 'hex': {\n const rgba = _color.toRgb();\n return rgba.a != 1 ? _color.toHex8String() : _color.toHexString();\n }\n default: {\n if (typeof color == 'string') {\n if (color.toLowerCase().startsWith('#')) return this.toString(color, 'hex');\n else return this.toString(color, 'rgba');\n } else {\n return this.toString(color, 'rgba');\n }\n }\n }\n }\n\n static isValid(color: AXColorFormat): boolean {\n const _color = tinycolor(color);\n return _color.isValid();\n }\n\n static mix(baseColor: AXColorFormat, hex: AXColorFormat, percentage: number): string {\n return tinycolor.mix(baseColor, hex, percentage).toString('rgb');\n }\n\n static multiply(color1: AXColorFormat, color2: AXColorFormat): string {\n const rgb1 = tinycolor(color1).toRgb();\n const rgb2 = tinycolor(color2).toRgb();\n rgb1.b = Math.floor((rgb1.b * rgb2.b) / 255);\n rgb1.g = Math.floor((rgb1.g * rgb2.g) / 255);\n rgb1.r = Math.floor((rgb1.r * rgb2.r) / 255);\n return tinycolor('rgb ' + rgb1.r + ' ' + rgb1.g + ' ' + rgb1.b).toString('rgb');\n }\n\n static contrastToWhite(color: AXColorFormat): number {\n return tinycolor.readability('#fff', color);\n }\n\n static lighten(hex: AXColorFormat, percentage?: number) {\n return tinycolor(hex).lighten(percentage);\n }\n\n static darken(hex: AXColorFormat, percentage?: number) {\n return tinycolor(hex).darken(percentage);\n }\n\n static brighten(hex: AXColorFormat, percentage?: number) {\n return tinycolor(hex).brighten(percentage);\n }\n\n static saturate(hex: AXColorFormat, percentage?: number) {\n return tinycolor(hex).saturate(percentage);\n }\n\n static desaturate(hex: AXColorFormat) {\n return tinycolor(hex).getLuminance();\n }\n\n static equal(color1: AXColorFormat, color2: AXColorFormat): boolean {\n return tinycolor.equals(color1, color2);\n }\n\n static gradient(values: unknown[] | { color: unknown; pos: number }[]): Instance {\n return tinygradient([...values]);\n }\n\n static getLuminance(hex: AXColorFormat) {\n return tinycolor(hex).getLuminance();\n }\n\n static xyToRgb(vX, vY): string {\n vY = vY || 0.00000000001;\n const Y = 1;\n const X = (Y / vY) * vX;\n const Z = (Y / vY) * (1 - vX - vY);\n\n // Convert to RGB using Wide RGB D65 conversion.\n let rgb = [\n X * 1.656492 - Y * 0.354851 - Z * 0.255038,\n -X * 0.707196 + Y * 1.655397 + Z * 0.036152,\n X * 0.051713 - Y * 0.121364 + Z * 1.01153,\n ];\n\n // Apply reverse gamma correction.\n rgb = rgb.map((x) => (x <= 0.0031308 ? 12.92 * x : (1.0 + 0.055) * Math.pow(x, 1.0 / 2.4) - 0.055));\n\n // Bring all negative components to zero.\n rgb = rgb.map((x) => Math.max(0, x));\n\n // If one component is greater than 1, weight components by that value.\n const max = Math.max(...rgb);\n if (max > 1) {\n rgb = rgb.map((x) => x / max);\n }\n\n rgb = rgb.map((x) => Math.round(x * 255));\n\n return 'rgb(' + rgb.join(',') + ')';\n }\n\n static colorStringToHex(color) {\n // Check if the input is an RGBA color string\n const rgbaMatch = color.match(/^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/i);\n if (rgbaMatch) {\n let [_, r, g, b, a] = rgbaMatch;\n r = parseInt(r, 10);\n g = parseInt(g, 10);\n b = parseInt(b, 10);\n a = a ? parseFloat(a) : 1;\n\n // Convert RGB to hex\n let hexColor = `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;\n\n // Include alpha if present\n if (a < 1) {\n const alphaHex = Math.round(a * 255)\n .toString(16)\n .padStart(2, '0');\n hexColor += alphaHex;\n }\n\n return hexColor;\n }\n\n // Check if the input is a hex color string\n const hexMatch = color.match(/^#([0-9a-fA-F]{3}){1,2}$/);\n if (hexMatch) {\n return color;\n }\n\n throw new Error('Invalid color format');\n }\n\n static getRandomColor(): string {\n // Generate a random hex color\n return `#${Math.floor(Math.random() * 16777215).toString(16)}`;\n }\n}\n","export interface AXPoint {\n x: number;\n y: number;\n}\n\nexport interface AXBoundingClientRect {\n left?: number;\n top?: number;\n width?: number;\n height?: number;\n bottom?: number;\n right?: number;\n}\n// @dynamic\nexport class AXDrawingUtil {\n static collision(a: HTMLElement, b: HTMLElement): boolean {\n const ac = a.getBoundingClientRect();\n const bc = b.getBoundingClientRect();\n\n if (\n ac.left < bc.left + bc.width &&\n ac.left + ac.width > bc.left &&\n ac.top < bc.top + bc.height &&\n ac.top + ac.height > bc.top\n ) {\n return true;\n } else {\n return false;\n }\n }\n\n static isInElementBound(pos: AXPoint, element: HTMLElement): boolean {\n const elBound = element.getBoundingClientRect();\n return AXDrawingUtil.isInRecPoint(pos, {\n left: elBound.x,\n width: elBound.width,\n top: elBound.y,\n height: elBound.height,\n });\n }\n\n static isInRecPoint(pos: AXPoint, rec: AXBoundingClientRect | any): boolean {\n return pos.x >= rec.left && pos.x <= rec.left + rec.width && pos.y >= rec.top && pos.y <= rec.top + rec.height;\n }\n\n static convertRemToPixels(rem: number): number {\n return rem * parseFloat(getComputedStyle(document.documentElement).fontSize);\n }\n}\n","/**\n * Blocks until a condition returns a value or the timeout is reached.\n * Useful for simulating sync behavior with cached async results.\n */\nexport function waitFor<T>(peekFn: () => T | null | undefined, loadFn: () => void, timeoutMs = 100): T | null {\n const end = Date.now() + timeoutMs;\n let result = peekFn();\n\n if (!result) {\n loadFn();\n while (!result && Date.now() < end) {\n result = peekFn();\n }\n }\n\n return result ?? null;\n}\n\n/**\n * Delays for a specific amount of time.\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retries an async function until it succeeds or a max attempt count is reached.\n */\nexport async function retryUntil<T>(fn: () => Promise<T>, attempts = 3, delayMs = 100): Promise<T> {\n let lastError: any;\n for (let i = 0; i < attempts; i++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n if (i < attempts - 1) await delay(delayMs);\n }\n }\n throw lastError;\n}\n\n/**\n * Continuously polls a condition until it returns true or a timeout is reached.\n */\nexport async function pollUntil(condition: () => boolean, intervalMs = 100, timeoutMs = 2000): Promise<boolean> {\n const start = Date.now();\n return new Promise((resolve, reject) => {\n const check = () => {\n if (condition()) {\n resolve(true);\n } else if (Date.now() - start >= timeoutMs) {\n reject(new Error('pollUntil timeout'));\n } else {\n setTimeout(check, intervalMs);\n }\n };\n check();\n });\n}\n\n/**\n * Throttles an async function to ensure only one instance runs at a time.\n */\nexport function throttleAsync<T extends (...args: any[]) => Promise<any>>(fn: T): T {\n let pending: Promise<any> | null = null;\n return ((...args: any[]) => {\n if (!pending) {\n pending = fn(...args).finally(() => {\n pending = null;\n });\n }\n return pending;\n }) as T;\n}\n\n/**\n * Polls a condition with cancel support via AbortSignal.\n */\nexport async function pollUntilAbortable(\n condition: () => boolean,\n intervalMs = 100,\n timeoutMs = 2000,\n signal?: AbortSignal,\n): Promise<boolean> {\n const start = Date.now();\n return new Promise((resolve, reject) => {\n const check = () => {\n if (signal?.aborted) {\n return reject(new Error('pollUntil aborted'));\n }\n if (condition()) {\n resolve(true);\n } else if (Date.now() - start >= timeoutMs) {\n reject(new Error('pollUntil timeout'));\n } else {\n setTimeout(check, intervalMs);\n }\n };\n check();\n });\n}\n\n/**\n * Debounces an async function to run only after no calls are made within the wait window.\n */\nexport function debounceAsync<T extends (...args: any[]) => Promise<any>>(fn: T, waitMs: number): T {\n let timeout: ReturnType<typeof setTimeout>;\n let promise: Promise<any> | null = null;\n\n return ((...args: any[]) => {\n if (timeout) clearTimeout(timeout);\n\n promise = new Promise((resolve) => {\n timeout = setTimeout(() => {\n resolve(fn(...args));\n }, waitMs);\n });\n\n return promise;\n }) as T;\n}\n\n/**\n * Runs a list of fallback functions until one resolves without throwing.\n */\nexport async function fallbackChain<T>(tasks: Array<() => Promise<T>>): Promise<T> {\n let lastError;\n for (const task of tasks) {\n try {\n return await task();\n } catch (err) {\n lastError = err;\n }\n }\n throw lastError ?? new Error('All fallback tasks failed');\n}\n","import { Injectable } from '@angular/core';\n\nconst HIGHLIGHT_TEXT_CLASS = 'ax-highlight-text';\nconst HIGHLIGHT_MATCH_CLASS = 'ax-highlight';\n\nconst IGNORED_PARENT_TAGS = new Set(['SCRIPT', 'STYLE', 'TEXTAREA', 'INPUT', 'SELECT', 'OPTION', 'NOSCRIPT']);\n\n/**\n * Service for applying and resetting text highlighting within specified HTML elements.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AXHighlightService {\n private querySelector: string | null = null;\n private searchValue: string | null = null;\n\n /**\n * Highlights all occurrences of a search value within the elements matching the provided query selector.\n *\n * @param querySelector - CSS selector to identify target elements.\n * @param searchValue - Text to search and highlight.\n */\n highlight(querySelector: string, searchValue: string): void {\n const trimmed = searchValue.trim();\n if (!querySelector || !trimmed) {\n return;\n }\n\n this.clear(querySelector);\n this.querySelector = querySelector;\n this.searchValue = trimmed;\n\n const elements = document.querySelectorAll(querySelector);\n const searchRegex = this.createSearchRegex(trimmed);\n\n elements.forEach((element) => {\n this.applyHighlight(element, searchRegex);\n });\n }\n\n /**\n * Resets highlighted text within the elements matching the query selector.\n *\n * @param querySelector - CSS selector to clear. Falls back to the last selector used by `highlight`.\n */\n clear(querySelector?: string): void {\n const selector = querySelector ?? this.querySelector;\n if (!selector) {\n return;\n }\n\n const elements = document.querySelectorAll(`${selector} .${HIGHLIGHT_TEXT_CLASS}`);\n elements.forEach((element) => {\n let combinedText = '';\n element.querySelectorAll('span').forEach((span) => {\n combinedText += span.textContent;\n });\n\n const mergedSpan = document.createElement('span');\n mergedSpan.textContent = combinedText;\n element.parentNode?.replaceChild(mergedSpan, element);\n });\n\n if (!querySelector || querySelector === this.querySelector) {\n this.querySelector = null;\n this.searchValue = null;\n }\n }\n\n private createSearchRegex(searchValue: string): RegExp {\n const escaped = searchValue.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(`(${escaped})`, 'gi');\n }\n\n private applyHighlight(element: Element, searchRegex: RegExp): void {\n this.recursivelyHighlight(element, searchRegex);\n }\n\n private recursivelyHighlight(element: Node, searchRegex: RegExp): void {\n const childNodes = Array.from(element.childNodes);\n\n childNodes.forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n const parent = node.parentElement;\n if (parent?.classList.contains(HIGHLIGHT_TEXT_CLASS) || (parent && IGNORED_PARENT_TAGS.has(parent.tagName))) {\n return;\n }\n\n const textContent = node.textContent ?? '';\n searchRegex.lastIndex = 0;\n\n if (searchRegex.test(textContent)) {\n const highlightedHtml = this.createHighlightedHTML(textContent, searchRegex);\n const tempContainer = document.createElement('div');\n tempContainer.innerHTML = highlightedHtml;\n\n const fragment = document.createDocumentFragment();\n Array.from(tempContainer.childNodes).forEach((child) => fragment.appendChild(child));\n node.replaceWith(fragment);\n }\n\n return;\n }\n\n if (node.nodeType === Node.ELEMENT_NODE) {\n this.recursivelyHighlight(node, searchRegex);\n }\n });\n }\n\n private createHighlightedHTML(textContent: string, searchRegex: RegExp): string {\n let lastIndex = 0;\n let resultHtml = `<span class=\"${HIGHLIGHT_TEXT_CLASS}\">`;\n let match: RegExpExecArray | null;\n\n searchRegex.lastIndex = 0;\n while ((match = searchRegex.exec(textContent)) !== null) {\n if (match.index > lastIndex) {\n resultHtml += `<span>${textContent.slice(lastIndex, match.index)}</span>`;\n }\n\n resultHtml += `<span class=\"${HIGHLIGHT_MATCH_CLASS}\">${match[0]}</span>`;\n lastIndex = searchRegex.lastIndex;\n\n if (match[0].length === 0) {\n searchRegex.lastIndex++;\n }\n }\n\n if (lastIndex < textContent.length) {\n resultHtml += `<span>${textContent.slice(lastIndex)}</span>`;\n }\n\n resultHtml += '</span>';\n return resultHtml;\n }\n}\n","import { isBrowser } from '@acorex/core/platform';\n\n/** ACoreX layout size classes applied on a host or container. */\nexport const AX_SIZE_CLASSES = ['ax-xs', 'ax-sm', 'ax-md', 'ax-lg', 'ax-xl'] as const;\n\nexport type AXSizeClass = (typeof AX_SIZE_CLASSES)[number];\n\n/** Resolved ACoreX size: the DOM node that carries the token and the token itself. */\nexport interface AXClosestAxSizeMatch {\n element: HTMLElement;\n sizeClass: AXSizeClass;\n}\n\nexport class AXHtmlUtil {\n static focusElement(element: HTMLElement): HTMLElement {\n const list = ['button', 'input', '[href]', 'select', 'textarea', '[tabindex]'].map(\n (c) => c + ':not([tabindex=\"-1\"])',\n );\n const focusable = element.querySelector<HTMLElement>(list.join(', '));\n if (focusable) {\n focusable.focus();\n return focusable;\n }\n return null;\n }\n\n static blurElement(element: HTMLElement): HTMLElement {\n const list = ['button', 'input', '[href]', 'select', 'textarea', '[tabindex]'].map(\n (c) => c + ':not([tabindex=\"-1\"])',\n );\n const focusable = element.querySelector<HTMLElement>(list.join(', '));\n if (focusable) {\n focusable.blur();\n return focusable;\n }\n return null;\n }\n\n static hasFocus(element: HTMLElement) {\n return element.matches(':focus-within') || element.matches(':focus');\n }\n\n static isRtl(element?: HTMLElement): boolean {\n if (!isBrowser()) {\n return false;\n }\n const docIsRtl = document.documentElement.dir === 'rtl';\n\n if (element) {\n const elementStyle = window.getComputedStyle(element);\n const elementDir = elementStyle.getPropertyValue('direction');\n if (elementDir === 'rtl') {\n return true;\n }\n if (elementDir === 'ltr') {\n return false;\n }\n if (element.classList.contains('ax-rtl')) {\n return true;\n }\n }\n return docIsRtl;\n }\n\n static hasDark(element: HTMLElement): boolean {\n if (isBrowser()) {\n return element.closest('.dark') ? true : false;\n }\n return false;\n }\n /**\n * Helper function to check if an element is scrollable\n */\n static isScrollable(element: HTMLElement): boolean {\n const overflowY = window.getComputedStyle(element).overflowY;\n return (overflowY === 'auto' || overflowY === 'scroll') && element.scrollHeight > element.clientHeight;\n }\n\n /**\n * Utility function to find scrollable parent elements\n */\n static getScrollableParents(element: HTMLElement): HTMLElement[] {\n const parents: HTMLElement[] = [];\n let currentElement: HTMLElement | null = element;\n\n while (currentElement) {\n if (AXHtmlUtil.isScrollable(currentElement)) {\n parents.push(currentElement);\n }\n currentElement = currentElement.parentElement;\n }\n\n return parents;\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { Observable, Subject, takeUntil } from 'rxjs';\n\nexport function AXAutoUnsubscriber() {\n return function (constructor) {\n const orig = constructor.prototype.ngOnDestroy;\n constructor.prototype.ngOnDestroy = function () {\n for (const prop in this) {\n const property = this[prop];\n if (typeof property.subscribe === 'function') {\n property.unsubscribe();\n }\n }\n orig.apply();\n };\n };\n}\n\n@Injectable()\nexport class AXUnsubscriber implements OnDestroy {\n private readonly _destroy$ = new Subject<void>();\n\n public readonly takeUntilDestroy = <T>(origin: Observable<T> | Subject<T>): Observable<T> | Subject<T> =>\n origin.pipe(takeUntil(this._destroy$));\n\n public unsubscribe(): void {\n this._destroy$.next();\n this._destroy$.complete();\n }\n\n public ngOnDestroy(): void {\n this.unsubscribe();\n }\n}\n","export function getWordBoundsAtPosition(str: string, position: number): { start: number; end: number } {\n const isSpace = (c) => /[^a-zA-Z0-9]+/i.test(c);\n let start = position - 1;\n\n while (start >= 0 && !isSpace(str[start])) {\n start -= 1;\n }\n start = Math.max(0, start + 1);\n const leftSideString: any = str.slice(start).match(/[a-zA-Z0-9]+/i);\n start += leftSideString.index;\n let end = start + leftSideString[0].length;\n return {\n start,\n end,\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-core-utils.mjs","sources":["../../../../packages/core/utils/src/lib/color.utils.ts","../../../../packages/core/utils/src/lib/drawing.utils.ts","../../../../packages/core/utils/src/lib/execution.utils.ts","../../../../packages/core/utils/src/lib/highlight.service.ts","../../../../packages/core/utils/src/lib/highlight-segments.ts","../../../../packages/core/utils/src/lib/html-utils.ts","../../../../packages/core/utils/src/lib/lifecycle-helpers.utils.ts","../../../../packages/core/utils/src/lib/string.utils.ts","../../../../packages/core/utils/src/acorex-core-utils.ts"],"sourcesContent":["export type AXColorMode = 'rgba' | 'hex' | 'hsla' | 'hsva' | null;\n\nimport tinycolor, { ColorInput } from 'tinycolor2';\nimport tinygradient, { Instance } from 'tinygradient-es';\n\nexport type AXColorFormat = ColorInput;\n\nexport class AXColorUtil {\n static to(color: AXColorFormat, mode: AXColorMode): AXColorFormat {\n const _color = tinycolor(color);\n switch (mode) {\n case 'rgba':\n return _color.toRgb();\n case 'hsla':\n return _color.toHsl();\n case 'hsva':\n return _color.toHsv();\n default:\n return _color.toHex();\n }\n }\n\n static toString(color: AXColorFormat, mode: AXColorMode = null): string {\n const _color = tinycolor(color);\n switch (mode) {\n case 'rgba':\n return _color.toRgbString();\n case 'hsla':\n return _color.toHslString();\n case 'hsva':\n return _color.toHsvString();\n\n case 'hex': {\n const rgba = _color.toRgb();\n return rgba.a != 1 ? _color.toHex8String() : _color.toHexString();\n }\n default: {\n if (typeof color == 'string') {\n if (color.toLowerCase().startsWith('#')) return this.toString(color, 'hex');\n else return this.toString(color, 'rgba');\n } else {\n return this.toString(color, 'rgba');\n }\n }\n }\n }\n\n static isValid(color: AXColorFormat): boolean {\n const _color = tinycolor(color);\n return _color.isValid();\n }\n\n static mix(baseColor: AXColorFormat, hex: AXColorFormat, percentage: number): string {\n return tinycolor.mix(baseColor, hex, percentage).toString('rgb');\n }\n\n static multiply(color1: AXColorFormat, color2: AXColorFormat): string {\n const rgb1 = tinycolor(color1).toRgb();\n const rgb2 = tinycolor(color2).toRgb();\n rgb1.b = Math.floor((rgb1.b * rgb2.b) / 255);\n rgb1.g = Math.floor((rgb1.g * rgb2.g) / 255);\n rgb1.r = Math.floor((rgb1.r * rgb2.r) / 255);\n return tinycolor('rgb ' + rgb1.r + ' ' + rgb1.g + ' ' + rgb1.b).toString('rgb');\n }\n\n static contrastToWhite(color: AXColorFormat): number {\n return tinycolor.readability('#fff', color);\n }\n\n static lighten(hex: AXColorFormat, percentage?: number) {\n return tinycolor(hex).lighten(percentage);\n }\n\n static darken(hex: AXColorFormat, percentage?: number) {\n return tinycolor(hex).darken(percentage);\n }\n\n static brighten(hex: AXColorFormat, percentage?: number) {\n return tinycolor(hex).brighten(percentage);\n }\n\n static saturate(hex: AXColorFormat, percentage?: number) {\n return tinycolor(hex).saturate(percentage);\n }\n\n static desaturate(hex: AXColorFormat) {\n return tinycolor(hex).getLuminance();\n }\n\n static equal(color1: AXColorFormat, color2: AXColorFormat): boolean {\n return tinycolor.equals(color1, color2);\n }\n\n static gradient(values: unknown[] | { color: unknown; pos: number }[]): Instance {\n return tinygradient([...values]);\n }\n\n static getLuminance(hex: AXColorFormat) {\n return tinycolor(hex).getLuminance();\n }\n\n static xyToRgb(vX, vY): string {\n vY = vY || 0.00000000001;\n const Y = 1;\n const X = (Y / vY) * vX;\n const Z = (Y / vY) * (1 - vX - vY);\n\n // Convert to RGB using Wide RGB D65 conversion.\n let rgb = [\n X * 1.656492 - Y * 0.354851 - Z * 0.255038,\n -X * 0.707196 + Y * 1.655397 + Z * 0.036152,\n X * 0.051713 - Y * 0.121364 + Z * 1.01153,\n ];\n\n // Apply reverse gamma correction.\n rgb = rgb.map((x) => (x <= 0.0031308 ? 12.92 * x : (1.0 + 0.055) * Math.pow(x, 1.0 / 2.4) - 0.055));\n\n // Bring all negative components to zero.\n rgb = rgb.map((x) => Math.max(0, x));\n\n // If one component is greater than 1, weight components by that value.\n const max = Math.max(...rgb);\n if (max > 1) {\n rgb = rgb.map((x) => x / max);\n }\n\n rgb = rgb.map((x) => Math.round(x * 255));\n\n return 'rgb(' + rgb.join(',') + ')';\n }\n\n static colorStringToHex(color) {\n // Check if the input is an RGBA color string\n const rgbaMatch = color.match(/^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/i);\n if (rgbaMatch) {\n let [_, r, g, b, a] = rgbaMatch;\n r = parseInt(r, 10);\n g = parseInt(g, 10);\n b = parseInt(b, 10);\n a = a ? parseFloat(a) : 1;\n\n // Convert RGB to hex\n let hexColor = `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;\n\n // Include alpha if present\n if (a < 1) {\n const alphaHex = Math.round(a * 255)\n .toString(16)\n .padStart(2, '0');\n hexColor += alphaHex;\n }\n\n return hexColor;\n }\n\n // Check if the input is a hex color string\n const hexMatch = color.match(/^#([0-9a-fA-F]{3}){1,2}$/);\n if (hexMatch) {\n return color;\n }\n\n throw new Error('Invalid color format');\n }\n\n static getRandomColor(): string {\n // Generate a random hex color\n return `#${Math.floor(Math.random() * 16777215).toString(16)}`;\n }\n}\n","export interface AXPoint {\n x: number;\n y: number;\n}\n\nexport interface AXBoundingClientRect {\n left?: number;\n top?: number;\n width?: number;\n height?: number;\n bottom?: number;\n right?: number;\n}\n// @dynamic\nexport class AXDrawingUtil {\n static collision(a: HTMLElement, b: HTMLElement): boolean {\n const ac = a.getBoundingClientRect();\n const bc = b.getBoundingClientRect();\n\n if (\n ac.left < bc.left + bc.width &&\n ac.left + ac.width > bc.left &&\n ac.top < bc.top + bc.height &&\n ac.top + ac.height > bc.top\n ) {\n return true;\n } else {\n return false;\n }\n }\n\n static isInElementBound(pos: AXPoint, element: HTMLElement): boolean {\n const elBound = element.getBoundingClientRect();\n return AXDrawingUtil.isInRecPoint(pos, {\n left: elBound.x,\n width: elBound.width,\n top: elBound.y,\n height: elBound.height,\n });\n }\n\n static isInRecPoint(pos: AXPoint, rec: AXBoundingClientRect | any): boolean {\n return pos.x >= rec.left && pos.x <= rec.left + rec.width && pos.y >= rec.top && pos.y <= rec.top + rec.height;\n }\n\n static convertRemToPixels(rem: number): number {\n return rem * parseFloat(getComputedStyle(document.documentElement).fontSize);\n }\n}\n","/**\n * Blocks until a condition returns a value or the timeout is reached.\n * Useful for simulating sync behavior with cached async results.\n */\nexport function waitFor<T>(peekFn: () => T | null | undefined, loadFn: () => void, timeoutMs = 100): T | null {\n const end = Date.now() + timeoutMs;\n let result = peekFn();\n\n if (!result) {\n loadFn();\n while (!result && Date.now() < end) {\n result = peekFn();\n }\n }\n\n return result ?? null;\n}\n\n/**\n * Delays for a specific amount of time.\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retries an async function until it succeeds or a max attempt count is reached.\n */\nexport async function retryUntil<T>(fn: () => Promise<T>, attempts = 3, delayMs = 100): Promise<T> {\n let lastError: any;\n for (let i = 0; i < attempts; i++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n if (i < attempts - 1) await delay(delayMs);\n }\n }\n throw lastError;\n}\n\n/**\n * Continuously polls a condition until it returns true or a timeout is reached.\n */\nexport async function pollUntil(condition: () => boolean, intervalMs = 100, timeoutMs = 2000): Promise<boolean> {\n const start = Date.now();\n return new Promise((resolve, reject) => {\n const check = () => {\n if (condition()) {\n resolve(true);\n } else if (Date.now() - start >= timeoutMs) {\n reject(new Error('pollUntil timeout'));\n } else {\n setTimeout(check, intervalMs);\n }\n };\n check();\n });\n}\n\n/**\n * Throttles an async function to ensure only one instance runs at a time.\n */\nexport function throttleAsync<T extends (...args: any[]) => Promise<any>>(fn: T): T {\n let pending: Promise<any> | null = null;\n return ((...args: any[]) => {\n if (!pending) {\n pending = fn(...args).finally(() => {\n pending = null;\n });\n }\n return pending;\n }) as T;\n}\n\n/**\n * Polls a condition with cancel support via AbortSignal.\n */\nexport async function pollUntilAbortable(\n condition: () => boolean,\n intervalMs = 100,\n timeoutMs = 2000,\n signal?: AbortSignal,\n): Promise<boolean> {\n const start = Date.now();\n return new Promise((resolve, reject) => {\n const check = () => {\n if (signal?.aborted) {\n return reject(new Error('pollUntil aborted'));\n }\n if (condition()) {\n resolve(true);\n } else if (Date.now() - start >= timeoutMs) {\n reject(new Error('pollUntil timeout'));\n } else {\n setTimeout(check, intervalMs);\n }\n };\n check();\n });\n}\n\n/**\n * Debounces an async function to run only after no calls are made within the wait window.\n */\nexport function debounceAsync<T extends (...args: any[]) => Promise<any>>(fn: T, waitMs: number): T {\n let timeout: ReturnType<typeof setTimeout>;\n let promise: Promise<any> | null = null;\n\n return ((...args: any[]) => {\n if (timeout) clearTimeout(timeout);\n\n promise = new Promise((resolve) => {\n timeout = setTimeout(() => {\n resolve(fn(...args));\n }, waitMs);\n });\n\n return promise;\n }) as T;\n}\n\n/**\n * Runs a list of fallback functions until one resolves without throwing.\n */\nexport async function fallbackChain<T>(tasks: Array<() => Promise<T>>): Promise<T> {\n let lastError;\n for (const task of tasks) {\n try {\n return await task();\n } catch (err) {\n lastError = err;\n }\n }\n throw lastError ?? new Error('All fallback tasks failed');\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { inject, Injectable, PLATFORM_ID } from '@angular/core';\n\nconst DEFAULT_HIGHLIGHT_TEXT_CLASS = 'ax-highlight-text';\nconst DEFAULT_HIGHLIGHT_MATCH_CLASS = 'ax-highlight';\n\nconst DEFAULT_IGNORED_PARENT_TAGS = new Set([\n 'SCRIPT',\n 'STYLE',\n 'TEXTAREA',\n 'INPUT',\n 'SELECT',\n 'OPTION',\n 'NOSCRIPT',\n]);\n\nexport type AXHighlightTarget = string | Element | readonly Element[];\n\nexport interface AXHighlightOptions {\n /** When false (default), matching is case-insensitive. */\n caseSensitive?: boolean;\n /** When true, only match whole words. */\n wholeWord?: boolean;\n /** Maximum number of matches to highlight across all targets. */\n maxMatches?: number;\n /** CSS class applied to highlighted match spans. */\n highlightClass?: string;\n /** CSS class applied to the wrapper span around highlighted text nodes. */\n wrapperClass?: string;\n /** Parent tag names whose text content is skipped. */\n ignoredTags?: readonly string[];\n}\n\ninterface AXHighlightResolvedOptions {\n caseSensitive: boolean;\n wholeWord: boolean;\n maxMatches: number;\n highlightClass: string;\n wrapperClass: string;\n ignoredTags: Set<string>;\n}\n\n/**\n * Service for applying and resetting text highlighting within specified HTML elements.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AXHighlightService {\n private readonly document = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n\n private readonly selectorStates = new Map<string, AXHighlightResolvedOptions>();\n private readonly elementStates = new WeakMap<Element, AXHighlightResolvedOptions>();\n private readonly trackedElements = new Set<Element>();\n\n /**\n * Highlights all occurrences of a search value within the elements matching the provided target.\n *\n * @param target - CSS selector, a single element, or an array of elements to search within.\n * @param term - Text or list of texts to search and highlight.\n * @param options - Optional highlight behavior configuration.\n * @returns The number of matches highlighted.\n */\n highlight(\n target: AXHighlightTarget,\n term: string | readonly string[],\n options?: AXHighlightOptions,\n ): number {\n if (!isPlatformBrowser(this.platformId)) {\n return 0;\n }\n\n const terms = this.normalizeTerms(term);\n const resolvedOptions = this.resolveOptions(options);\n\n if (!terms.length) {\n this.clear(target);\n return 0;\n }\n\n const roots = this.resolveRoots(target);\n if (!roots.length) {\n return 0;\n }\n\n this.clear(target);\n this.registerState(target, resolvedOptions);\n\n const searchRegex = this.createSearchRegex(terms, resolvedOptions);\n let matchCount = 0;\n\n for (const root of roots) {\n if (matchCount >= resolvedOptions.maxMatches) {\n break;\n }\n\n const textNodes = this.collectTextNodes(root, resolvedOptions);\n for (const textNode of textNodes) {\n if (matchCount >= resolvedOptions.maxMatches) {\n break;\n }\n\n const added = this.highlightTextNode(textNode, searchRegex, resolvedOptions, resolvedOptions.maxMatches - matchCount);\n matchCount += added;\n }\n }\n\n return matchCount;\n }\n\n /**\n * Resets highlighted text within the elements matching the target.\n * When no target is provided, clears all highlights registered by this service.\n *\n * @param target - CSS selector, element, or elements to clear.\n */\n clear(target?: AXHighlightTarget): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n if (target === undefined) {\n for (const selector of [...this.selectorStates.keys()]) {\n this.clearSelector(selector, this.selectorStates.get(selector)!);\n }\n this.selectorStates.clear();\n\n for (const element of [...this.trackedElements]) {\n this.clearElement(element, this.elementStates.get(element));\n }\n this.trackedElements.clear();\n return;\n }\n\n if (typeof target === 'string') {\n const options = this.selectorStates.get(target) ?? this.resolveOptions();\n this.clearSelector(target, options);\n this.selectorStates.delete(target);\n return;\n }\n\n const elements = this.toElementArray(target);\n for (const element of elements) {\n const options = this.elementStates.get(element) ?? this.resolveOptions();\n this.clearElement(element, options);\n this.elementStates.delete(element);\n this.trackedElements.delete(element);\n }\n }\n\n private toElementArray(target: Element | readonly Element[]): Element[] {\n if (Array.isArray(target)) {\n return [...target];\n }\n\n return [target as Element];\n }\n\n private normalizeTerms(term: string | readonly string[]): string[] {\n const terms = Array.isArray(term) ? term : [term];\n return terms.map((value) => value.trim()).filter(Boolean);\n }\n\n private resolveOptions(options?: AXHighlightOptions): AXHighlightResolvedOptions {\n return {\n caseSensitive: options?.caseSensitive ?? false,\n wholeWord: options?.wholeWord ?? false,\n maxMatches: options?.maxMatches ?? Number.POSITIVE_INFINITY,\n highlightClass: options?.highlightClass ?? DEFAULT_HIGHLIGHT_MATCH_CLASS,\n wrapperClass: options?.wrapperClass ?? DEFAULT_HIGHLIGHT_TEXT_CLASS,\n ignoredTags: new Set(options?.ignoredTags ?? DEFAULT_IGNORED_PARENT_TAGS),\n };\n }\n\n private registerState(target: AXHighlightTarget, options: AXHighlightResolvedOptions): void {\n if (typeof target === 'string') {\n this.selectorStates.set(target, options);\n return;\n }\n\n const elements = this.toElementArray(target);\n for (const element of elements) {\n this.elementStates.set(element, options);\n this.trackedElements.add(element);\n }\n }\n\n private resolveRoots(target: AXHighlightTarget): Element[] {\n if (typeof target === 'string') {\n if (!target) {\n return [];\n }\n return Array.from(this.document.querySelectorAll(target));\n }\n\n return this.toElementArray(target);\n }\n\n private createSearchRegex(terms: string[], options: AXHighlightResolvedOptions): RegExp {\n const escaped = [...terms]\n .sort((left, right) => right.length - left.length)\n .map((term) => term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n\n const pattern = options.wholeWord ? `\\\\b(?:${escaped.join('|')})\\\\b` : `(?:${escaped.join('|')})`;\n const flags = options.caseSensitive ? 'g' : 'gi';\n return new RegExp(`(${pattern})`, flags);\n }\n\n private collectTextNodes(root: Element, options: AXHighlightResolvedOptions): Text[] {\n const textNodes: Text[] = [];\n const walker = this.document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {\n acceptNode: (node) => {\n const textNode = node as Text;\n const parent = textNode.parentElement;\n if (!parent) {\n return NodeFilter.FILTER_REJECT;\n }\n\n if (parent.classList.contains(options.wrapperClass)) {\n return NodeFilter.FILTER_REJECT;\n }\n\n if (options.ignoredTags.has(parent.tagName)) {\n return NodeFilter.FILTER_REJECT;\n }\n\n if (parent.closest('[contenteditable=\"true\"]')) {\n return NodeFilter.FILTER_REJECT;\n }\n\n const content = textNode.textContent ?? '';\n return content.length > 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n });\n\n let current = walker.nextNode();\n while (current) {\n textNodes.push(current as Text);\n current = walker.nextNode();\n }\n\n return textNodes;\n }\n\n private highlightTextNode(\n textNode: Text,\n searchRegex: RegExp,\n options: AXHighlightResolvedOptions,\n remainingMatches: number,\n ): number {\n const textContent = textNode.textContent ?? '';\n searchRegex.lastIndex = 0;\n\n if (!searchRegex.test(textContent) || remainingMatches <= 0) {\n return 0;\n }\n\n const fragment = this.document.createDocumentFragment();\n const wrapper = this.document.createElement('span');\n wrapper.classList.add(options.wrapperClass);\n\n let lastIndex = 0;\n let matchCount = 0;\n let match: RegExpExecArray | null;\n\n searchRegex.lastIndex = 0;\n while ((match = searchRegex.exec(textContent)) !== null && matchCount < remainingMatches) {\n if (match.index > lastIndex) {\n wrapper.appendChild(this.document.createTextNode(textContent.slice(lastIndex, match.index)));\n }\n\n const matchSpan = this.document.createElement('span');\n matchSpan.classList.add(options.highlightClass);\n matchSpan.textContent = match[0];\n wrapper.appendChild(matchSpan);\n\n lastIndex = searchRegex.lastIndex;\n matchCount++;\n\n if (match[0].length === 0) {\n searchRegex.lastIndex++;\n }\n }\n\n if (matchCount === 0) {\n return 0;\n }\n\n if (lastIndex < textContent.length) {\n wrapper.appendChild(this.document.createTextNode(textContent.slice(lastIndex)));\n }\n\n fragment.appendChild(wrapper);\n textNode.replaceWith(fragment);\n return matchCount;\n }\n\n private clearSelector(selector: string, options: AXHighlightResolvedOptions): void {\n const wrappers = this.document.querySelectorAll(`${selector} .${options.wrapperClass}`);\n wrappers.forEach((wrapper) => this.unwrapHighlight(wrapper));\n }\n\n private clearElement(element: Element, options?: AXHighlightResolvedOptions): void {\n const wrapperClass = options?.wrapperClass ?? DEFAULT_HIGHLIGHT_TEXT_CLASS;\n const wrappers = element.querySelectorAll(`.${wrapperClass}`);\n wrappers.forEach((wrapper) => this.unwrapHighlight(wrapper));\n }\n\n private unwrapHighlight(wrapper: Element): void {\n const parent = wrapper.parentNode;\n if (!parent) {\n return;\n }\n\n const textNode = this.document.createTextNode(wrapper.textContent ?? '');\n parent.replaceChild(textNode, wrapper);\n parent.normalize();\n }\n}\n","import type { AXHighlightOptions } from './highlight.service';\n\nexport interface AXHighlightSegment {\n text: string;\n match: boolean;\n}\n\ninterface AXHighlightSegmentResolvedOptions {\n caseSensitive: boolean;\n wholeWord: boolean;\n}\n\nfunction normalizeTerms(term: string | readonly string[]): string[] {\n const terms = Array.isArray(term) ? term : [term];\n return terms.map((value) => value.trim()).filter(Boolean);\n}\n\nfunction resolveSegmentOptions(options?: AXHighlightOptions): AXHighlightSegmentResolvedOptions {\n return {\n caseSensitive: options?.caseSensitive ?? false,\n wholeWord: options?.wholeWord ?? false,\n };\n}\n\nfunction createHighlightSearchRegex(terms: string[], options: AXHighlightSegmentResolvedOptions): RegExp {\n const escaped = [...terms]\n .sort((left, right) => right.length - left.length)\n .map((term) => term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n\n const pattern = options.wholeWord ? `\\\\b(?:${escaped.join('|')})\\\\b` : `(?:${escaped.join('|')})`;\n const flags = options.caseSensitive ? 'g' : 'gi';\n return new RegExp(`(${pattern})`, flags);\n}\n\n/**\n * Splits text into highlighted and non-highlighted segments for template rendering.\n * Uses the same matching semantics as {@link AXHighlightService}.\n */\nexport function splitHighlightSegments(\n text: string,\n term: string | readonly string[],\n options?: AXHighlightOptions,\n): AXHighlightSegment[] {\n const content = text ?? '';\n const terms = normalizeTerms(term);\n if (!terms.length || !content) {\n return content ? [{ text: content, match: false }] : [];\n }\n\n const resolvedOptions = resolveSegmentOptions(options);\n const searchRegex = createHighlightSearchRegex(terms, resolvedOptions);\n searchRegex.lastIndex = 0;\n\n if (!searchRegex.test(content)) {\n return [{ text: content, match: false }];\n }\n\n const segments: AXHighlightSegment[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n searchRegex.lastIndex = 0;\n while ((match = searchRegex.exec(content)) !== null) {\n if (match.index > lastIndex) {\n segments.push({ text: content.slice(lastIndex, match.index), match: false });\n }\n\n segments.push({ text: match[0], match: true });\n lastIndex = searchRegex.lastIndex;\n\n if (match[0].length === 0) {\n searchRegex.lastIndex++;\n }\n }\n\n if (lastIndex < content.length) {\n segments.push({ text: content.slice(lastIndex), match: false });\n }\n\n return segments.length > 0 ? segments : [{ text: content, match: false }];\n}\n","import { isBrowser } from '@acorex/core/platform';\n\n/** ACoreX layout size classes applied on a host or container. */\nexport const AX_SIZE_CLASSES = ['ax-xs', 'ax-sm', 'ax-md', 'ax-lg', 'ax-xl'] as const;\n\nexport type AXSizeClass = (typeof AX_SIZE_CLASSES)[number];\n\n/** Resolved ACoreX size: the DOM node that carries the token and the token itself. */\nexport interface AXClosestAxSizeMatch {\n element: HTMLElement;\n sizeClass: AXSizeClass;\n}\n\nexport class AXHtmlUtil {\n static focusElement(element: HTMLElement): HTMLElement {\n const list = ['button', 'input', '[href]', 'select', 'textarea', '[tabindex]'].map(\n (c) => c + ':not([tabindex=\"-1\"])',\n );\n const focusable = element.querySelector<HTMLElement>(list.join(', '));\n if (focusable) {\n focusable.focus();\n return focusable;\n }\n return null;\n }\n\n static blurElement(element: HTMLElement): HTMLElement {\n const list = ['button', 'input', '[href]', 'select', 'textarea', '[tabindex]'].map(\n (c) => c + ':not([tabindex=\"-1\"])',\n );\n const focusable = element.querySelector<HTMLElement>(list.join(', '));\n if (focusable) {\n focusable.blur();\n return focusable;\n }\n return null;\n }\n\n static hasFocus(element: HTMLElement) {\n return element.matches(':focus-within') || element.matches(':focus');\n }\n\n static isRtl(element?: HTMLElement): boolean {\n if (!isBrowser()) {\n return false;\n }\n const docIsRtl = document.documentElement.dir === 'rtl';\n\n if (element) {\n const elementStyle = window.getComputedStyle(element);\n const elementDir = elementStyle.getPropertyValue('direction');\n if (elementDir === 'rtl') {\n return true;\n }\n if (elementDir === 'ltr') {\n return false;\n }\n if (element.classList.contains('ax-rtl')) {\n return true;\n }\n }\n return docIsRtl;\n }\n\n static hasDark(element: HTMLElement): boolean {\n if (isBrowser()) {\n return element.closest('.dark') ? true : false;\n }\n return false;\n }\n /**\n * Helper function to check if an element is scrollable\n */\n static isScrollable(element: HTMLElement): boolean {\n const overflowY = window.getComputedStyle(element).overflowY;\n return (overflowY === 'auto' || overflowY === 'scroll') && element.scrollHeight > element.clientHeight;\n }\n\n /**\n * Utility function to find scrollable parent elements\n */\n static getScrollableParents(element: HTMLElement): HTMLElement[] {\n const parents: HTMLElement[] = [];\n let currentElement: HTMLElement | null = element;\n\n while (currentElement) {\n if (AXHtmlUtil.isScrollable(currentElement)) {\n parents.push(currentElement);\n }\n currentElement = currentElement.parentElement;\n }\n\n return parents;\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { Observable, Subject, takeUntil } from 'rxjs';\n\nexport function AXAutoUnsubscriber() {\n return function (constructor) {\n const orig = constructor.prototype.ngOnDestroy;\n constructor.prototype.ngOnDestroy = function () {\n for (const prop in this) {\n const property = this[prop];\n if (typeof property.subscribe === 'function') {\n property.unsubscribe();\n }\n }\n orig.apply();\n };\n };\n}\n\n@Injectable()\nexport class AXUnsubscriber implements OnDestroy {\n private readonly _destroy$ = new Subject<void>();\n\n public readonly takeUntilDestroy = <T>(origin: Observable<T> | Subject<T>): Observable<T> | Subject<T> =>\n origin.pipe(takeUntil(this._destroy$));\n\n public unsubscribe(): void {\n this._destroy$.next();\n this._destroy$.complete();\n }\n\n public ngOnDestroy(): void {\n this.unsubscribe();\n }\n}\n","export function getWordBoundsAtPosition(str: string, position: number): { start: number; end: number } {\n const isSpace = (c) => /[^a-zA-Z0-9]+/i.test(c);\n let start = position - 1;\n\n while (start >= 0 && !isSpace(str[start])) {\n start -= 1;\n }\n start = Math.max(0, start + 1);\n const leftSideString: any = str.slice(start).match(/[a-zA-Z0-9]+/i);\n start += leftSideString.index;\n let end = start + leftSideString[0].length;\n return {\n start,\n end,\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|