@ethlete/core 3.9.0 → 3.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,72 +1,97 @@
1
- import { ElementRef, effect, inject } from '@angular/core';
2
- export const signalClasses = (el, classMap) => {
3
- for (const [classString, signal] of Object.entries(classMap)) {
4
- const classArray = classString.split(' ');
5
- if (!classArray.length) {
6
- continue;
1
+ import { coerceElement } from '@angular/cdk/coercion';
2
+ import { ElementRef, computed, effect, inject, isSignal, signal } from '@angular/core';
3
+ import { toSignal } from '@angular/core/rxjs-interop';
4
+ import { Observable, map } from 'rxjs';
5
+ const buildElementSignal = (el) => {
6
+ let mElSignal = null;
7
+ if (el instanceof Observable) {
8
+ mElSignal = toSignal(el.pipe(map((elOrRef) => coerceElement(elOrRef))), { initialValue: null });
9
+ }
10
+ else if (isSignal(el)) {
11
+ mElSignal = computed(() => coerceElement(el()));
12
+ }
13
+ else {
14
+ mElSignal = signal(coerceElement(el));
15
+ }
16
+ return mElSignal;
17
+ };
18
+ export const buildSignalEffects = (config) => {
19
+ const { map, eachItemFn, cleanupFn } = config;
20
+ const effectRefMap = {};
21
+ for (const [tokenString, signal] of Object.entries(map)) {
22
+ const tokenArray = tokenString.split(' ').filter((token) => !!token);
23
+ for (const token of tokenArray) {
24
+ const ref = effect(() => {
25
+ const value = signal();
26
+ eachItemFn({ key: token, value });
27
+ });
28
+ effectRefMap[token] = ref;
29
+ }
30
+ }
31
+ const has = (token) => token in effectRefMap;
32
+ const remove = (...tokens) => {
33
+ for (const tokenString of tokens) {
34
+ effectRefMap[tokenString]?.destroy();
35
+ cleanupFn({ key: tokenString, value: map[tokenString]?.() });
36
+ delete effectRefMap[tokenString];
7
37
  }
8
- effect(() => {
9
- const value = signal();
38
+ };
39
+ return { remove, has };
40
+ };
41
+ export const signalClasses = (el, classMap) => {
42
+ const element = buildElementSignal(el);
43
+ return buildSignalEffects({
44
+ map: classMap,
45
+ eachItemFn: ({ key, value }) => {
10
46
  if (value) {
11
- el.classList.add(...classArray);
47
+ element()?.classList.add(key);
12
48
  }
13
49
  else {
14
- el.classList.remove(...classArray);
50
+ element()?.classList.remove(key);
15
51
  }
16
- });
17
- }
18
- };
19
- export const signalHostClasses = (classMap) => {
20
- const el = inject(ElementRef).nativeElement;
21
- signalClasses(el, classMap);
52
+ },
53
+ cleanupFn: ({ key }) => element()?.classList.remove(key),
54
+ });
22
55
  };
56
+ export const signalHostClasses = (classMap) => signalClasses(inject(ElementRef), classMap);
23
57
  const ALWAYS_TRUE_ATTRIBUTE_KEYS = ['disabled', 'readonly', 'required', 'checked', 'selected'];
24
58
  export const signalAttributes = (el, attributeMap) => {
25
- for (const [attributeString, signal] of Object.entries(attributeMap)) {
26
- effect(() => {
27
- const attributeArray = attributeString.split(' ');
28
- if (!attributeArray.length) {
29
- return;
30
- }
31
- const value = signal();
59
+ const element = buildElementSignal(el);
60
+ return buildSignalEffects({
61
+ map: attributeMap,
62
+ eachItemFn: ({ key, value }) => {
32
63
  const valueString = `${value}`;
33
- for (const attr of attributeArray) {
34
- if (ALWAYS_TRUE_ATTRIBUTE_KEYS.includes(attr)) {
35
- if (value) {
36
- el.setAttribute(attr, '');
37
- }
38
- else {
39
- el.removeAttribute(attr);
40
- }
64
+ if (ALWAYS_TRUE_ATTRIBUTE_KEYS.includes(key)) {
65
+ if (value) {
66
+ element()?.setAttribute(key, '');
41
67
  }
42
68
  else {
43
- el.setAttribute(attr, valueString);
69
+ element()?.removeAttribute(key);
44
70
  }
45
71
  }
46
- });
47
- }
48
- };
49
- export const signalHostAttributes = (attributeMap) => {
50
- const el = inject(ElementRef).nativeElement;
51
- signalAttributes(el, attributeMap);
52
- };
53
- export const signalStyle = (el, styleMap) => {
54
- for (const [styleString, signal] of Object.entries(styleMap)) {
55
- effect(() => {
56
- const styleArray = styleString.split(' ');
57
- if (!styleArray.length) {
58
- return;
59
- }
60
- const value = signal();
61
- const valueString = `${value}`;
62
- for (const style of styleArray) {
63
- el.style.setProperty(style, valueString);
72
+ else {
73
+ if (value === null || value === undefined) {
74
+ element()?.removeAttribute(key);
75
+ }
76
+ else {
77
+ element()?.setAttribute(key, valueString);
78
+ }
64
79
  }
65
- });
66
- }
80
+ },
81
+ cleanupFn: ({ key }) => element()?.removeAttribute(key),
82
+ });
67
83
  };
68
- export const signalHostStyle = (styleMap) => {
69
- const el = inject(ElementRef).nativeElement;
70
- signalStyle(el, styleMap);
84
+ export const signalHostAttributes = (attributeMap) => signalAttributes(inject(ElementRef), attributeMap);
85
+ export const signalStyles = (el, styleMap) => {
86
+ const element = buildElementSignal(el);
87
+ return buildSignalEffects({
88
+ map: styleMap,
89
+ eachItemFn: ({ key, value }) => {
90
+ const valueString = `${value}`;
91
+ element()?.style.setProperty(key, valueString);
92
+ },
93
+ cleanupFn: ({ key }) => element()?.style.removeProperty(key),
94
+ });
71
95
  };
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvdXRpbHMvc2lnbmFsLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBNEMsRUFBZSxFQUFFLFFBQVcsRUFBRSxFQUFFO0lBQ3ZHLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQzVELE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFMUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUU7WUFDdEIsU0FBUztTQUNWO1FBRUQsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDO1lBRXZCLElBQUksS0FBSyxFQUFFO2dCQUNULEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7YUFDakM7aUJBQU07Z0JBQ0wsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQzthQUNwQztRQUNILENBQUMsQ0FBQyxDQUFDO0tBQ0o7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUE0QyxRQUFXLEVBQUUsRUFBRTtJQUMxRixNQUFNLEVBQUUsR0FBRyxNQUFNLENBQTBCLFVBQVUsQ0FBQyxDQUFDLGFBQWEsQ0FBQztJQUVyRSxhQUFhLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzlCLENBQUMsQ0FBQztBQUVGLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFFL0YsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBNEMsRUFBZSxFQUFFLFlBQWUsRUFBRSxFQUFFO0lBQzlHLEtBQUssTUFBTSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO1FBQ3BFLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWxELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFO2dCQUMxQixPQUFPO2FBQ1I7WUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQztZQUN2QixNQUFNLFdBQVcsR0FBRyxHQUFHLEtBQUssRUFBRSxDQUFDO1lBRS9CLEtBQUssTUFBTSxJQUFJLElBQUksY0FBYyxFQUFFO2dCQUNqQyxJQUFJLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDN0MsSUFBSSxLQUFLLEVBQUU7d0JBQ1QsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7cUJBQzNCO3lCQUFNO3dCQUNMLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQzFCO2lCQUNGO3FCQUFNO29CQUNMLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2lCQUNwQzthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7S0FDSjtBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQTRDLFlBQWUsRUFBRSxFQUFFO0lBQ2pHLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBMEIsVUFBVSxDQUFDLENBQUMsYUFBYSxDQUFDO0lBRXJFLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNyQyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBNEMsRUFBZSxFQUFFLFFBQVcsRUFBRSxFQUFFO0lBQ3JHLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQzVELE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRTFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFO2dCQUN0QixPQUFPO2FBQ1I7WUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQztZQUN2QixNQUFNLFdBQVcsR0FBRyxHQUFHLEtBQUssRUFBRSxDQUFDO1lBRS9CLEtBQUssTUFBTSxLQUFLLElBQUksVUFBVSxFQUFFO2dCQUM5QixFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7YUFDMUM7UUFDSCxDQUFDLENBQUMsQ0FBQztLQUNKO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQTRDLFFBQVcsRUFBRSxFQUFFO0lBQ3hGLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBMEIsVUFBVSxDQUFDLENBQUMsYUFBYSxDQUFDO0lBRXJFLFdBQVcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiwgU2lnbmFsLCBlZmZlY3QsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsQ2xhc3NlcyA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+Pj4oZWw6IEhUTUxFbGVtZW50LCBjbGFzc01hcDogVCkgPT4ge1xuICBmb3IgKGNvbnN0IFtjbGFzc1N0cmluZywgc2lnbmFsXSBvZiBPYmplY3QuZW50cmllcyhjbGFzc01hcCkpIHtcbiAgICBjb25zdCBjbGFzc0FycmF5ID0gY2xhc3NTdHJpbmcuc3BsaXQoJyAnKTtcblxuICAgIGlmICghY2xhc3NBcnJheS5sZW5ndGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHNpZ25hbCgpO1xuXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCguLi5jbGFzc0FycmF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoLi4uY2xhc3NBcnJheSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxIb3N0Q2xhc3NlcyA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+Pj4oY2xhc3NNYXA6IFQpID0+IHtcbiAgY29uc3QgZWwgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgc2lnbmFsQ2xhc3NlcyhlbCwgY2xhc3NNYXApO1xufTtcblxuY29uc3QgQUxXQVlTX1RSVUVfQVRUUklCVVRFX0tFWVMgPSBbJ2Rpc2FibGVkJywgJ3JlYWRvbmx5JywgJ3JlcXVpcmVkJywgJ2NoZWNrZWQnLCAnc2VsZWN0ZWQnXTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEF0dHJpYnV0ZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KGVsOiBIVE1MRWxlbWVudCwgYXR0cmlidXRlTWFwOiBUKSA9PiB7XG4gIGZvciAoY29uc3QgW2F0dHJpYnV0ZVN0cmluZywgc2lnbmFsXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVNYXApKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZUFycmF5ID0gYXR0cmlidXRlU3RyaW5nLnNwbGl0KCcgJyk7XG5cbiAgICAgIGlmICghYXR0cmlidXRlQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSBzaWduYWwoKTtcbiAgICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gYCR7dmFsdWV9YDtcblxuICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGF0dHJpYnV0ZUFycmF5KSB7XG4gICAgICAgIGlmIChBTFdBWVNfVFJVRV9BVFRSSUJVVEVfS0VZUy5pbmNsdWRlcyhhdHRyKSkge1xuICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKGF0dHIsICcnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGF0dHIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoYXR0ciwgdmFsdWVTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxIb3N0QXR0cmlidXRlcyA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+Pj4oYXR0cmlidXRlTWFwOiBUKSA9PiB7XG4gIGNvbnN0IGVsID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKS5uYXRpdmVFbGVtZW50O1xuXG4gIHNpZ25hbEF0dHJpYnV0ZXMoZWwsIGF0dHJpYnV0ZU1hcCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsU3R5bGUgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KGVsOiBIVE1MRWxlbWVudCwgc3R5bGVNYXA6IFQpID0+IHtcbiAgZm9yIChjb25zdCBbc3R5bGVTdHJpbmcsIHNpZ25hbF0gb2YgT2JqZWN0LmVudHJpZXMoc3R5bGVNYXApKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHN0eWxlQXJyYXkgPSBzdHlsZVN0cmluZy5zcGxpdCgnICcpO1xuXG4gICAgICBpZiAoIXN0eWxlQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSBzaWduYWwoKTtcbiAgICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gYCR7dmFsdWV9YDtcblxuICAgICAgZm9yIChjb25zdCBzdHlsZSBvZiBzdHlsZUFycmF5KSB7XG4gICAgICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KHN0eWxlLCB2YWx1ZVN0cmluZyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxIb3N0U3R5bGUgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KHN0eWxlTWFwOiBUKSA9PiB7XG4gIGNvbnN0IGVsID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKS5uYXRpdmVFbGVtZW50O1xuXG4gIHNpZ25hbFN0eWxlKGVsLCBzdHlsZU1hcCk7XG59O1xuIl19
96
+ export const signalHostStyles = (styleMap) => signalStyles(inject(ElementRef), styleMap);
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvdXRpbHMvc2lnbmFsLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQWEsVUFBVSxFQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBUXZDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxFQUE0QixFQUFFLEVBQUU7SUFDMUQsSUFBSSxTQUFTLEdBQWtELElBQUksQ0FBQztJQUVwRSxJQUFJLEVBQUUsWUFBWSxVQUFVLEVBQUU7UUFDNUIsU0FBUyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQ2pHO1NBQU0sSUFBSSxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDdkIsU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ2pEO1NBQU07UUFDTCxTQUFTLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ3ZDO0lBRUQsT0FBTyxTQUFtRCxDQUFDO0FBQzdELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQTRDLE1B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RUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQzdCLE1BQU0sV0FBVyxHQUFHLEdBQUcsS0FBSyxFQUFFLENBQUM7WUFFL0IsT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELFNBQVMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO0tBQzdELENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQTRDLFFBQVcsRUFBRSxFQUFFLENBQ3pGLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2VyY2VFbGVtZW50IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IEVmZmVjdFJlZiwgRWxlbWVudFJlZiwgU2lnbmFsLCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIGlzU2lnbmFsLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgbWFwIH0gZnJvbSAncnhqcyc7XG5cbnR5cGUgU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlID1cbiAgfCBIVE1MRWxlbWVudFxuICB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gIHwgT2JzZXJ2YWJsZTxIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgbnVsbCB8IHVuZGVmaW5lZD5cbiAgfCBTaWduYWw8SFRNTEVsZW1lbnQgfCBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IG51bGwgfCB1bmRlZmluZWQ+O1xuXG5jb25zdCBidWlsZEVsZW1lbnRTaWduYWwgPSAoZWw6IFNpZ25hbEVsZW1lbnRCaW5kaW5nVHlwZSkgPT4ge1xuICBsZXQgbUVsU2lnbmFsOiBTaWduYWw8SFRNTEVsZW1lbnQgfCBudWxsIHwgdW5kZWZpbmVkPiB8IG51bGwgPSBudWxsO1xuXG4gIGlmIChlbCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICBtRWxTaWduYWwgPSB0b1NpZ25hbChlbC5waXBlKG1hcCgoZWxPclJlZikgPT4gY29lcmNlRWxlbWVudChlbE9yUmVmKSkpLCB7IGluaXRpYWxWYWx1ZTogbnVsbCB9KTtcbiAgfSBlbHNlIGlmIChpc1NpZ25hbChlbCkpIHtcbiAgICBtRWxTaWduYWwgPSBjb21wdXRlZCgoKSA9PiBjb2VyY2VFbGVtZW50KGVsKCkpKTtcbiAgfSBlbHNlIHtcbiAgICBtRWxTaWduYWwgPSBzaWduYWwoY29lcmNlRWxlbWVudChlbCkpO1xuICB9XG5cbiAgcmV0dXJuIG1FbFNpZ25hbCBhcyBTaWduYWw8SFRNTEVsZW1lbnQgfCBudWxsIHwgdW5kZWZpbmVkPjtcbn07XG5cbmV4cG9ydCBjb25zdCBidWlsZFNpZ25hbEVmZmVjdHMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KGNvbmZpZzoge1xuICBtYXA6IFQ7XG4gIGVhY2hJdGVtRm46IChwYWlyOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9KSA9PiB2b2lkO1xuICBjbGVhbnVwRm46IChwYWlyOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9KSA9PiB2b2lkO1xufSkgPT4ge1xuICBjb25zdCB7IG1hcCwgZWFjaEl0ZW1GbiwgY2xlYW51cEZuIH0gPSBjb25maWc7XG5cbiAgY29uc3QgZWZmZWN0UmVmTWFwOiBSZWNvcmQ8c3RyaW5nLCBFZmZlY3RSZWY+ID0ge307XG5cbiAgZm9yIChjb25zdCBbdG9rZW5TdHJpbmcsIHNpZ25hbF0gb2YgT2JqZWN0LmVudHJpZXMobWFwKSkge1xuICAgIGNvbnN0IHRva2VuQXJyYXkgPSB0b2tlblN0cmluZy5zcGxpdCgnICcpLmZpbHRlcigodG9rZW4pID0+ICEhdG9rZW4pO1xuXG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbkFycmF5KSB7XG4gICAgICBjb25zdCByZWYgPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHNpZ25hbCgpO1xuICAgICAgICBlYWNoSXRlbUZuKHsga2V5OiB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICB9KTtcblxuICAgICAgZWZmZWN0UmVmTWFwW3Rva2VuXSA9IHJlZjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYXMgPSAodG9rZW46IHN0cmluZykgPT4gdG9rZW4gaW4gZWZmZWN0UmVmTWFwO1xuXG4gIGNvbnN0IHJlbW92ZSA9ICguLi50b2tlbnM6IHN0cmluZ1tdKSA9PiB7XG4gICAgZm9yIChjb25zdCB0b2tlblN0cmluZyBvZiB0b2tlbnMpIHtcbiAgICAgIGVmZmVjdFJlZk1hcFt0b2tlblN0cmluZ10/LmRlc3Ryb3koKTtcblxuICAgICAgY2xlYW51cEZuKHsga2V5OiB0b2tlblN0cmluZywgdmFsdWU6IG1hcFt0b2tlblN0cmluZ10/LigpIH0pO1xuXG4gICAgICBkZWxldGUgZWZmZWN0UmVmTWFwW3Rva2VuU3RyaW5nXTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHsgcmVtb3ZlLCBoYXMgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxDbGFzc2VzID0gPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8dW5rbm93bj4+PihlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlLCBjbGFzc01hcDogVCkgPT4ge1xuICBjb25zdCBlbGVtZW50ID0gYnVpbGRFbGVtZW50U2lnbmFsKGVsKTtcblxuICByZXR1cm4gYnVpbGRTaWduYWxFZmZlY3RzKHtcbiAgICBtYXA6IGNsYXNzTWFwLFxuICAgIGVhY2hJdGVtRm46ICh7IGtleSwgdmFsdWUgfSkgPT4ge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGVsZW1lbnQoKT8uY2xhc3NMaXN0LmFkZChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudCgpPy5jbGFzc0xpc3QucmVtb3ZlKGtleSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBjbGVhbnVwRm46ICh7IGtleSB9KSA9PiBlbGVtZW50KCk/LmNsYXNzTGlzdC5yZW1vdmUoa2V5KSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsSG9zdENsYXNzZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KGNsYXNzTWFwOiBUKSA9PlxuICBzaWduYWxDbGFzc2VzKGluamVjdChFbGVtZW50UmVmKSwgY2xhc3NNYXApO1xuXG5jb25zdCBBTFdBWVNfVFJVRV9BVFRSSUJVVEVfS0VZUyA9IFsnZGlzYWJsZWQnLCAncmVhZG9ubHknLCAncmVxdWlyZWQnLCAnY2hlY2tlZCcsICdzZWxlY3RlZCddO1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsQXR0cmlidXRlcyA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+Pj4oXG4gIGVsOiBTaWduYWxFbGVtZW50QmluZGluZ1R5cGUsXG4gIGF0dHJpYnV0ZU1hcDogVCxcbikgPT4ge1xuICBjb25zdCBlbGVtZW50ID0gYnVpbGRFbGVtZW50U2lnbmFsKGVsKTtcblxuICByZXR1cm4gYnVpbGRTaWduYWxFZmZlY3RzKHtcbiAgICBtYXA6IGF0dHJpYnV0ZU1hcCxcbiAgICBlYWNoSXRlbUZuOiAoeyBrZXksIHZhbHVlIH0pID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gYCR7dmFsdWV9YDtcblxuICAgICAgaWYgKEFMV0FZU19UUlVFX0FUVFJJQlVURV9LRVlTLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgZWxlbWVudCgpPy5zZXRBdHRyaWJ1dGUoa2V5LCAnJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbWVudCgpPy5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbGVtZW50KCk/LnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnQoKT8uc2V0QXR0cmlidXRlKGtleSwgdmFsdWVTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBjbGVhbnVwRm46ICh7IGtleSB9KSA9PiBlbGVtZW50ISgpPy5yZW1vdmVBdHRyaWJ1dGUoa2V5KSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsSG9zdEF0dHJpYnV0ZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KGF0dHJpYnV0ZU1hcDogVCkgPT5cbiAgc2lnbmFsQXR0cmlidXRlcyhpbmplY3QoRWxlbWVudFJlZiksIGF0dHJpYnV0ZU1hcCk7XG5cbmV4cG9ydCBjb25zdCBzaWduYWxTdHlsZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KGVsOiBTaWduYWxFbGVtZW50QmluZGluZ1R5cGUsIHN0eWxlTWFwOiBUKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnQgPSBidWlsZEVsZW1lbnRTaWduYWwoZWwpO1xuXG4gIHJldHVybiBidWlsZFNpZ25hbEVmZmVjdHMoe1xuICAgIG1hcDogc3R5bGVNYXAsXG4gICAgZWFjaEl0ZW1GbjogKHsga2V5LCB2YWx1ZSB9KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZVN0cmluZyA9IGAke3ZhbHVlfWA7XG5cbiAgICAgIGVsZW1lbnQoKT8uc3R5bGUuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZVN0cmluZyk7XG4gICAgfSxcbiAgICBjbGVhbnVwRm46ICh7IGtleSB9KSA9PiBlbGVtZW50KCk/LnN0eWxlLnJlbW92ZVByb3BlcnR5KGtleSksXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEhvc3RTdHlsZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KHN0eWxlTWFwOiBUKSA9PlxuICBzaWduYWxTdHlsZXMoaW5qZWN0KEVsZW1lbnRSZWYpLCBzdHlsZU1hcCk7XG4iXX0=
@@ -1,10 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, Component, ChangeDetectionStrategy, ViewEncapsulation, Input, HostBinding, InjectionToken, assertInInjectionContext, DestroyRef, ElementRef, effect, isDevMode, Directive, Injectable, NgZone, EventEmitter, booleanAttribute, numberAttribute, Output, Injector, ViewContainerRef, signal, TemplateRef, computed, Pipe, QueryList } from '@angular/core';
2
+ import { inject, Component, ChangeDetectionStrategy, ViewEncapsulation, Input, HostBinding, InjectionToken, assertInInjectionContext, DestroyRef, ElementRef, isSignal, computed, signal, effect, isDevMode, Directive, Injectable, NgZone, EventEmitter, booleanAttribute, numberAttribute, Output, Injector, ViewContainerRef, TemplateRef, Pipe, QueryList } from '@angular/core';
3
3
  import { DomSanitizer, Meta, Title } from '@angular/platform-browser';
4
- import { Subject, BehaviorSubject, takeUntil, switchMap, of, tap, Observable, combineLatest, timer, startWith, map, distinctUntilChanged, shareReplay, skip, take, debounceTime, merge, fromEvent, filter, takeWhile, pairwise, finalize } from 'rxjs';
4
+ import { Subject, BehaviorSubject, takeUntil, switchMap, of, tap, startWith, Observable, combineLatest, timer, map, distinctUntilChanged, shareReplay, skip, take, debounceTime, merge, fromEvent, filter, takeWhile, pairwise, finalize } from 'rxjs';
5
5
  import { END, HOME, PAGE_DOWN, PAGE_UP, UP_ARROW, DOWN_ARROW } from '@angular/cdk/keycodes';
6
6
  import { FormGroup, FormArray, FormControl } from '@angular/forms';
7
- import { coerceCssPixelValue, coerceElement } from '@angular/cdk/coercion';
7
+ import { takeUntilDestroyed, toSignal, toObservable } from '@angular/core/rxjs-interop';
8
+ import { coerceElement, coerceCssPixelValue } from '@angular/cdk/coercion';
8
9
  import { supportsScrollBehavior } from '@angular/cdk/platform';
9
10
  import * as i1 from '@angular/common';
10
11
  import { NgIf, DOCUMENT } from '@angular/common';
@@ -14,7 +15,6 @@ import { autoUpdate, computePosition, offset, flip, size, shift, limitShift, arr
14
15
  import { Router, NavigationEnd } from '@angular/router';
15
16
  import { __decorate, __metadata } from 'tslib';
16
17
  import { BreakpointObserver } from '@angular/cdk/layout';
17
- import { toObservable } from '@angular/core/rxjs-interop';
18
18
  import { debounceTime as debounceTime$1 } from 'rxjs/operators';
19
19
 
20
20
  class StructuredDataComponent {
@@ -182,6 +182,12 @@ class ActiveSelectionModel {
182
182
  }
183
183
  }
184
184
 
185
+ function switchQueryListChanges() {
186
+ return function (source) {
187
+ return source.pipe(switchMap((value) => value?.changes.pipe(startWith(value)) ?? of(null)));
188
+ };
189
+ }
190
+
185
191
  const nextFrame = (cb) => {
186
192
  requestAnimationFrame(() => {
187
193
  requestAnimationFrame(cb);
@@ -699,6 +705,17 @@ const createMutationObservable = (config) => {
699
705
 
700
706
  const isAttributeRenderBinding = (value) => typeof value === 'boolean';
701
707
  const isAttributeValueBinding = (value) => typeof value === 'object';
708
+ /**
709
+ * @deprecated Use one of the following instead:
710
+ * - `signalHostAttributes`
711
+ * - `signalHostClasses`
712
+ * - `signalHostStyles`
713
+ * - `signalAttributes`
714
+ * - `signalClasses`
715
+ * - `signalStyles`
716
+ *
717
+ * Will be removed in v4.
718
+ */
702
719
  const createReactiveBindings = (...values) => {
703
720
  assertInInjectionContext(createReactiveBindings);
704
721
  const rootElementRef = inject(ElementRef);
@@ -990,6 +1007,7 @@ class SelectionModel {
990
1007
  this._valueBinding$ = new BehaviorSubject(null);
991
1008
  this._keyBinding$ = new BehaviorSubject(null);
992
1009
  this._labelBinding$ = new BehaviorSubject(null);
1010
+ this._disabledBinding$ = new BehaviorSubject(null);
993
1011
  this._allowMultiple$ = new BehaviorSubject(false);
994
1012
  this._filter$ = new BehaviorSubject('');
995
1013
  this.value$ = combineLatest([this.selection$, this.valueBinding$, this.allowMultiple$]).pipe(map(([selection, valueBinding, allowMultiple]) => {
@@ -1034,6 +1052,12 @@ class SelectionModel {
1034
1052
  get labelBinding() {
1035
1053
  return this._labelBinding$.value;
1036
1054
  }
1055
+ get disabledBinding$() {
1056
+ return this._disabledBinding$.asObservable();
1057
+ }
1058
+ get disabledBinding() {
1059
+ return this._disabledBinding$.value;
1060
+ }
1037
1061
  get allowMultiple$() {
1038
1062
  return this._allowMultiple$.asObservable();
1039
1063
  }
@@ -1065,10 +1089,28 @@ class SelectionModel {
1065
1089
  this._labelBinding$.next(fnOrPropertyPath);
1066
1090
  return this;
1067
1091
  }
1092
+ setDisabledBinding(fnOrPropertyPath) {
1093
+ this._disabledBinding$.next(fnOrPropertyPath);
1094
+ return this;
1095
+ }
1068
1096
  setOptions(options) {
1069
1097
  this._options$.next(options);
1070
1098
  return this;
1071
1099
  }
1100
+ setOptionsFromQueryList(queryList) {
1101
+ assertInInjectionContext(this.setOptionsFromQueryList);
1102
+ queryList.changes
1103
+ .pipe(startWith(queryList), tap((list) => this.setOptions(list.toArray())), takeUntilDestroyed())
1104
+ .subscribe();
1105
+ return this;
1106
+ }
1107
+ setOptionsFromQueryList$(queryList$) {
1108
+ assertInInjectionContext(this.setOptionsFromQueryList$);
1109
+ queryList$
1110
+ .pipe(switchQueryListChanges(), tap((list) => this.setOptions(list?.toArray() || [])), takeUntilDestroyed())
1111
+ .subscribe();
1112
+ return this;
1113
+ }
1072
1114
  setAllowMultiple(allowMultiple) {
1073
1115
  this._allowMultiple$.next(allowMultiple);
1074
1116
  return this;
@@ -1097,6 +1139,9 @@ class SelectionModel {
1097
1139
  isSelected$(option) {
1098
1140
  return this._selection$.pipe(map(() => this.isSelected(option)));
1099
1141
  }
1142
+ isDisabled$(option) {
1143
+ return this._optionsAndSelection$.pipe(map(() => this.isDisabled(option)));
1144
+ }
1100
1145
  getLabel$(option) {
1101
1146
  return this.labelBinding$.pipe(map((labelBinding) => this.execFnOrGetOptionProperty(option, labelBinding)));
1102
1147
  }
@@ -1193,6 +1238,9 @@ class SelectionModel {
1193
1238
  getKey(option) {
1194
1239
  return this.execFnOrGetOptionProperty(option, this.keyBinding);
1195
1240
  }
1241
+ getDisabled(option) {
1242
+ return this.execFnOrGetOptionProperty(option, this.disabledBinding);
1243
+ }
1196
1244
  execFnOrGetOptionProperty(option, fnOrPropertyPath) {
1197
1245
  if (!fnOrPropertyPath || !isObject(option))
1198
1246
  return option;
@@ -1210,6 +1258,9 @@ class SelectionModel {
1210
1258
  const optionKey = this.execFnOrGetOptionProperty(option, this.keyBinding);
1211
1259
  return this.getOption(optionKey, this.keyBinding, this.selection) !== undefined;
1212
1260
  }
1261
+ isDisabled(option) {
1262
+ return this.execFnOrGetOptionProperty(option, this.disabledBinding);
1263
+ }
1213
1264
  getFilteredOptions(filter = this.filter, options = this.options) {
1214
1265
  if (!filter)
1215
1266
  return options;
@@ -1252,6 +1303,7 @@ class SelectionModel {
1252
1303
  this.addSelectedOption(option);
1253
1304
  }
1254
1305
  }
1306
+ // FIXME: Toggle should respect disabled binding if it exists
1255
1307
  toggleAllSelectedOptions() {
1256
1308
  const filteredOptions = this.getFilteredOptions();
1257
1309
  const unselectedOptions = filteredOptions.filter((option) => !this.isSelected(option));
@@ -1266,76 +1318,98 @@ class SelectionModel {
1266
1318
  }
1267
1319
  }
1268
1320
 
1269
- const signalClasses = (el, classMap) => {
1270
- for (const [classString, signal] of Object.entries(classMap)) {
1271
- const classArray = classString.split(' ');
1272
- if (!classArray.length) {
1273
- continue;
1321
+ const buildElementSignal = (el) => {
1322
+ let mElSignal = null;
1323
+ if (el instanceof Observable) {
1324
+ mElSignal = toSignal(el.pipe(map((elOrRef) => coerceElement(elOrRef))), { initialValue: null });
1325
+ }
1326
+ else if (isSignal(el)) {
1327
+ mElSignal = computed(() => coerceElement(el()));
1328
+ }
1329
+ else {
1330
+ mElSignal = signal(coerceElement(el));
1331
+ }
1332
+ return mElSignal;
1333
+ };
1334
+ const buildSignalEffects = (config) => {
1335
+ const { map, eachItemFn, cleanupFn } = config;
1336
+ const effectRefMap = {};
1337
+ for (const [tokenString, signal] of Object.entries(map)) {
1338
+ const tokenArray = tokenString.split(' ').filter((token) => !!token);
1339
+ for (const token of tokenArray) {
1340
+ const ref = effect(() => {
1341
+ const value = signal();
1342
+ eachItemFn({ key: token, value });
1343
+ });
1344
+ effectRefMap[token] = ref;
1274
1345
  }
1275
- effect(() => {
1276
- const value = signal();
1346
+ }
1347
+ const has = (token) => token in effectRefMap;
1348
+ const remove = (...tokens) => {
1349
+ for (const tokenString of tokens) {
1350
+ effectRefMap[tokenString]?.destroy();
1351
+ cleanupFn({ key: tokenString, value: map[tokenString]?.() });
1352
+ delete effectRefMap[tokenString];
1353
+ }
1354
+ };
1355
+ return { remove, has };
1356
+ };
1357
+ const signalClasses = (el, classMap) => {
1358
+ const element = buildElementSignal(el);
1359
+ return buildSignalEffects({
1360
+ map: classMap,
1361
+ eachItemFn: ({ key, value }) => {
1277
1362
  if (value) {
1278
- el.classList.add(...classArray);
1363
+ element()?.classList.add(key);
1279
1364
  }
1280
1365
  else {
1281
- el.classList.remove(...classArray);
1366
+ element()?.classList.remove(key);
1282
1367
  }
1283
- });
1284
- }
1285
- };
1286
- const signalHostClasses = (classMap) => {
1287
- const el = inject(ElementRef).nativeElement;
1288
- signalClasses(el, classMap);
1368
+ },
1369
+ cleanupFn: ({ key }) => element()?.classList.remove(key),
1370
+ });
1289
1371
  };
1372
+ const signalHostClasses = (classMap) => signalClasses(inject(ElementRef), classMap);
1290
1373
  const ALWAYS_TRUE_ATTRIBUTE_KEYS = ['disabled', 'readonly', 'required', 'checked', 'selected'];
1291
1374
  const signalAttributes = (el, attributeMap) => {
1292
- for (const [attributeString, signal] of Object.entries(attributeMap)) {
1293
- effect(() => {
1294
- const attributeArray = attributeString.split(' ');
1295
- if (!attributeArray.length) {
1296
- return;
1297
- }
1298
- const value = signal();
1375
+ const element = buildElementSignal(el);
1376
+ return buildSignalEffects({
1377
+ map: attributeMap,
1378
+ eachItemFn: ({ key, value }) => {
1299
1379
  const valueString = `${value}`;
1300
- for (const attr of attributeArray) {
1301
- if (ALWAYS_TRUE_ATTRIBUTE_KEYS.includes(attr)) {
1302
- if (value) {
1303
- el.setAttribute(attr, '');
1304
- }
1305
- else {
1306
- el.removeAttribute(attr);
1307
- }
1380
+ if (ALWAYS_TRUE_ATTRIBUTE_KEYS.includes(key)) {
1381
+ if (value) {
1382
+ element()?.setAttribute(key, '');
1308
1383
  }
1309
1384
  else {
1310
- el.setAttribute(attr, valueString);
1385
+ element()?.removeAttribute(key);
1311
1386
  }
1312
1387
  }
1313
- });
1314
- }
1315
- };
1316
- const signalHostAttributes = (attributeMap) => {
1317
- const el = inject(ElementRef).nativeElement;
1318
- signalAttributes(el, attributeMap);
1319
- };
1320
- const signalStyle = (el, styleMap) => {
1321
- for (const [styleString, signal] of Object.entries(styleMap)) {
1322
- effect(() => {
1323
- const styleArray = styleString.split(' ');
1324
- if (!styleArray.length) {
1325
- return;
1326
- }
1327
- const value = signal();
1328
- const valueString = `${value}`;
1329
- for (const style of styleArray) {
1330
- el.style.setProperty(style, valueString);
1388
+ else {
1389
+ if (value === null || value === undefined) {
1390
+ element()?.removeAttribute(key);
1391
+ }
1392
+ else {
1393
+ element()?.setAttribute(key, valueString);
1394
+ }
1331
1395
  }
1332
- });
1333
- }
1396
+ },
1397
+ cleanupFn: ({ key }) => element()?.removeAttribute(key),
1398
+ });
1334
1399
  };
1335
- const signalHostStyle = (styleMap) => {
1336
- const el = inject(ElementRef).nativeElement;
1337
- signalStyle(el, styleMap);
1400
+ const signalHostAttributes = (attributeMap) => signalAttributes(inject(ElementRef), attributeMap);
1401
+ const signalStyles = (el, styleMap) => {
1402
+ const element = buildElementSignal(el);
1403
+ return buildSignalEffects({
1404
+ map: styleMap,
1405
+ eachItemFn: ({ key, value }) => {
1406
+ const valueString = `${value}`;
1407
+ element()?.style.setProperty(key, valueString);
1408
+ },
1409
+ cleanupFn: ({ key }) => element()?.style.removeProperty(key),
1410
+ });
1338
1411
  };
1412
+ const signalHostStyles = (styleMap) => signalStyles(inject(ElementRef), styleMap);
1339
1413
 
1340
1414
  const scrollBehaviorSupported = supportsScrollBehavior();
1341
1415
  let _uniqueIdCounter = 0;
@@ -1581,10 +1655,8 @@ class AnimatedLifecycleDirective {
1581
1655
  this._isConstructed = false;
1582
1656
  this._state$ = new BehaviorSubject('init');
1583
1657
  this.state$ = this._state$.asObservable();
1584
- this._bindings = createReactiveBindings({
1585
- attribute: 'class.et-force-invisible',
1586
- observable: this._state$.pipe(map((state) => state === 'init')),
1587
- eager: true,
1658
+ this.hostClassBindings = signalHostClasses({
1659
+ 'et-force-invisible': toSignal(this._state$.pipe(map((state) => state === 'init'))),
1588
1660
  });
1589
1661
  }
1590
1662
  get state() {
@@ -3502,6 +3574,8 @@ class ObserveVisibilityDirective {
3502
3574
  this._elementRef = inject(ElementRef);
3503
3575
  this._intersectionObserverService = inject(IntersectionObserverService);
3504
3576
  this.visibilityChange = signal(null);
3577
+ this.currentVisibility = this.visibilityChange.asReadonly();
3578
+ this.currentVisibility$ = toObservable(this.currentVisibility);
3505
3579
  this.etObserveVisibility = new EventEmitter();
3506
3580
  signalHostClasses(signalVisibilityChangeClasses({
3507
3581
  name: 'et-observe-visibility',
@@ -4184,5 +4258,5 @@ const Validators = {
4184
4258
  * Generated bundle index. Do not edit.
4185
4259
  */
4186
4260
 
4187
- export { ANIMATABLE_TOKEN, ANIMATED_IF_TOKEN, ANIMATED_LIFECYCLE_TOKEN, AT_LEAST_ONE_REQUIRED, ActiveSelectionModel, AnimatableDirective, AnimatedIfDirective, AnimatedLifecycleDirective, AnimatedOverlayDirective, ClickObserverFactory, ClickObserverService, ClickOutsideDirective, ContentObserverService, CursorDragScrollDirective, DEBUG_TOKEN, DEFAULT_VIEWPORT_CONFIG, DELAYABLE_TOKEN, DebugDirective, DelayableDirective, ET_PROPERTY_REMOVED, FocusVisibleService, IS_ACTIVE_ELEMENT, IS_ARRAY_NOT_EMPTY, IS_ELEMENT, IS_EMAIL, IntersectionObserverFactory, IntersectionObserverService, IsActiveElementDirective, IsArrayNotEmpty, IsElementDirective, IsEmail, KeyPressManager, LetContext, LetDirective, MUST_MATCH, Memo, MustMatch, MutationObserverFactory, NormalizeGameResultTypePipe, NormalizeMatchParticipantsPipe, NormalizeMatchScorePipe, NormalizeMatchStatePipe, NormalizeMatchTypePipe, OBSERVE_SCROLL_STATE, OBSERVE_VISIBILITY_TOKEN, ObserveContentDirective, ObserveResizeDirective, ObserveScrollStateDirective, ObserveVisibilityDirective, RUNTIME_ERROR_NO_DATA, RepeatDirective, ResizeObserverFactory, ResizeObserverService, RouterStateService, RuntimeError, SCROLL_OBSERVER_FIRST_ELEMENT_CLASS, SCROLL_OBSERVER_IGNORE_TARGET_CLASS, SCROLL_OBSERVER_LAST_ELEMENT_CLASS, SCROLL_OBSERVER_OBSERVING_FIRST_ELEMENT_CLASS, SCROLL_OBSERVER_OBSERVING_LAST_ELEMENT_CLASS, SEO_DIRECTIVE_TOKEN, ScrollObserverFirstElementDirective, ScrollObserverIgnoreTargetDirective, ScrollObserverLastElementDirective, SelectionModel, SeoDirective, SmartBlockScrollStrategy, StructuredDataComponent, ToArrayPipe, TypedQueryList, VIEWPORT_CONFIG, ValidateAtLeastOneRequired, Validators, ViewportService, clamp, clone, cloneFormGroup, createDestroy, createFlipAnimation, createFlipAnimationGroup, createMediaQueryObservable, createMutationObservable, createReactiveBindings, createResizeObservable, deleteCookie, elementCanScroll, equal, forceReflow, formatRuntimeError, fromNextFrame, getCookie, getDomain, getElementVisibleStates, getFormGroupValue, getGroupMatchPoints, getGroupMatchScore, getKnockoutMatchScore, getMatchScoreSubLine, hasCookie, isElementVisible, isEmptyArray, isGroupMatch, isKnockoutMatch, isObjectArray, isPrimitiveArray, mergeSeoConfig, nextFrame, normalizeGameResultType, normalizeMatchParticipant, normalizeMatchParticipants, normalizeMatchScore, normalizeMatchState, normalizeMatchType, provideViewportConfig, round, routerDisableScrollTop, scrollToElement, setCookie, signalAttributes, signalClasses, signalHostAttributes, signalHostClasses, signalHostStyle, signalStyle, signalVisibilityChangeClasses, toArray, toArrayTrackByFn };
4261
+ export { ANIMATABLE_TOKEN, ANIMATED_IF_TOKEN, ANIMATED_LIFECYCLE_TOKEN, AT_LEAST_ONE_REQUIRED, ActiveSelectionModel, AnimatableDirective, AnimatedIfDirective, AnimatedLifecycleDirective, AnimatedOverlayDirective, ClickObserverFactory, ClickObserverService, ClickOutsideDirective, ContentObserverService, CursorDragScrollDirective, DEBUG_TOKEN, DEFAULT_VIEWPORT_CONFIG, DELAYABLE_TOKEN, DebugDirective, DelayableDirective, ET_PROPERTY_REMOVED, FocusVisibleService, IS_ACTIVE_ELEMENT, IS_ARRAY_NOT_EMPTY, IS_ELEMENT, IS_EMAIL, IntersectionObserverFactory, IntersectionObserverService, IsActiveElementDirective, IsArrayNotEmpty, IsElementDirective, IsEmail, KeyPressManager, LetContext, LetDirective, MUST_MATCH, Memo, MustMatch, MutationObserverFactory, NormalizeGameResultTypePipe, NormalizeMatchParticipantsPipe, NormalizeMatchScorePipe, NormalizeMatchStatePipe, NormalizeMatchTypePipe, OBSERVE_SCROLL_STATE, OBSERVE_VISIBILITY_TOKEN, ObserveContentDirective, ObserveResizeDirective, ObserveScrollStateDirective, ObserveVisibilityDirective, RUNTIME_ERROR_NO_DATA, RepeatDirective, ResizeObserverFactory, ResizeObserverService, RouterStateService, RuntimeError, SCROLL_OBSERVER_FIRST_ELEMENT_CLASS, SCROLL_OBSERVER_IGNORE_TARGET_CLASS, SCROLL_OBSERVER_LAST_ELEMENT_CLASS, SCROLL_OBSERVER_OBSERVING_FIRST_ELEMENT_CLASS, SCROLL_OBSERVER_OBSERVING_LAST_ELEMENT_CLASS, SEO_DIRECTIVE_TOKEN, ScrollObserverFirstElementDirective, ScrollObserverIgnoreTargetDirective, ScrollObserverLastElementDirective, SelectionModel, SeoDirective, SmartBlockScrollStrategy, StructuredDataComponent, ToArrayPipe, TypedQueryList, VIEWPORT_CONFIG, ValidateAtLeastOneRequired, Validators, ViewportService, buildSignalEffects, clamp, clone, cloneFormGroup, createDestroy, createFlipAnimation, createFlipAnimationGroup, createMediaQueryObservable, createMutationObservable, createReactiveBindings, createResizeObservable, deleteCookie, elementCanScroll, equal, forceReflow, formatRuntimeError, fromNextFrame, getCookie, getDomain, getElementVisibleStates, getFormGroupValue, getGroupMatchPoints, getGroupMatchScore, getKnockoutMatchScore, getMatchScoreSubLine, hasCookie, isElementVisible, isEmptyArray, isGroupMatch, isKnockoutMatch, isObjectArray, isPrimitiveArray, mergeSeoConfig, nextFrame, normalizeGameResultType, normalizeMatchParticipant, normalizeMatchParticipants, normalizeMatchScore, normalizeMatchState, normalizeMatchType, provideViewportConfig, round, routerDisableScrollTop, scrollToElement, setCookie, signalAttributes, signalClasses, signalHostAttributes, signalHostClasses, signalHostStyles, signalStyles, signalVisibilityChangeClasses, switchQueryListChanges, toArray, toArrayTrackByFn };
4188
4262
  //# sourceMappingURL=ethlete-core.mjs.map