@yuuvis/client-framework 2.5.2 → 2.6.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.
Files changed (40) hide show
  1. package/actions/lib/components/contextmenu/contextmenu.component.d.ts +2 -0
  2. package/common/index.d.ts +1 -0
  3. package/common/lib/components/halo-focus/halo-focus.component.d.ts +5 -0
  4. package/datepicker/lib/calendar/calendar.component.d.ts +1 -2
  5. package/fesm2022/yuuvis-client-framework-actions.mjs +6 -4
  6. package/fesm2022/yuuvis-client-framework-actions.mjs.map +1 -1
  7. package/fesm2022/yuuvis-client-framework-autocomplete.mjs +3 -2
  8. package/fesm2022/yuuvis-client-framework-autocomplete.mjs.map +1 -1
  9. package/fesm2022/yuuvis-client-framework-common.mjs +10 -1
  10. package/fesm2022/yuuvis-client-framework-common.mjs.map +1 -1
  11. package/fesm2022/yuuvis-client-framework-datepicker.mjs +10 -19
  12. package/fesm2022/yuuvis-client-framework-datepicker.mjs.map +1 -1
  13. package/fesm2022/yuuvis-client-framework-forms.mjs +33 -15
  14. package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -1
  15. package/fesm2022/yuuvis-client-framework-list.mjs +12 -0
  16. package/fesm2022/yuuvis-client-framework-list.mjs.map +1 -1
  17. package/fesm2022/yuuvis-client-framework-object-flavor.mjs +1 -1
  18. package/fesm2022/yuuvis-client-framework-object-flavor.mjs.map +1 -1
  19. package/fesm2022/yuuvis-client-framework-object-relationship.mjs +198 -198
  20. package/fesm2022/yuuvis-client-framework-object-relationship.mjs.map +1 -1
  21. package/fesm2022/yuuvis-client-framework-simple-search.mjs +92 -58
  22. package/fesm2022/yuuvis-client-framework-simple-search.mjs.map +1 -1
  23. package/fesm2022/yuuvis-client-framework-split-view.mjs +55 -4
  24. package/fesm2022/yuuvis-client-framework-split-view.mjs.map +1 -1
  25. package/fesm2022/yuuvis-client-framework-tile-list.mjs +4 -4
  26. package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -1
  27. package/fesm2022/yuuvis-client-framework.mjs +231 -2
  28. package/fesm2022/yuuvis-client-framework.mjs.map +1 -1
  29. package/forms/lib/elements/datetime/datetime.component.d.ts +1 -0
  30. package/index.d.ts +2 -2
  31. package/lib/providers/halo-focus/provide-halo-focus.d.ts +10 -0
  32. package/lib/providers/index.d.ts +1 -0
  33. package/lib/services/halo-focus/halo-focus.service.d.ts +7 -0
  34. package/lib/services/index.d.ts +3 -0
  35. package/list/lib/list-item.directive.d.ts +7 -1
  36. package/package.json +9 -9
  37. package/simple-search/lib/models/index.d.ts +1 -0
  38. package/simple-search/lib/models/object-type-aggregation.model.d.ts +14 -0
  39. package/simple-search/lib/simple-search/simple-search.component.d.ts +13 -23
  40. package/split-view/lib/split-area-cover.directive.d.ts +15 -0
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { NgModule, inject, Injectable, signal, Component } from '@angular/core';
2
+ import { NgModule, Injectable, inject, signal, Component, provideAppInitializer, NgZone } from '@angular/core';
3
3
  import { CommonModule } from '@angular/common';
4
4
  import { MatSnackBar, MatSnackBarRef, MAT_SNACK_BAR_DATA, MatSnackBarLabel, MatSnackBarActions, MatSnackBarAction } from '@angular/material/snack-bar';
5
5
  import * as i1 from '@angular/material/button';
@@ -17,6 +17,219 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
17
17
  }]
18
18
  }] });
19
19
 
20
+ class HaloFocusService {
21
+ #haloEl = null;
22
+ #currentEl = null;
23
+ #rafId = null; //Request Animation Frame ID
24
+ #resizeObserver;
25
+ #mutationObserver;
26
+ #defaultPadding = 3;
27
+ #noPaddingComponents = ['yuv-shell-logo'];
28
+ init() {
29
+ this.#appendHaloElementToDOM();
30
+ this.#initListeners();
31
+ this.#initObservers();
32
+ }
33
+ #appendHaloElementToDOM() {
34
+ this.#haloEl = document.createElement('div');
35
+ this.#haloEl.id = 'focus-halo';
36
+ this.#haloEl.setAttribute('aria-hidden', 'true');
37
+ Object.assign(this.#haloEl.style, {
38
+ position: 'fixed',
39
+ pointerEvents: 'none',
40
+ zIndex: '9999',
41
+ border: '2px solid var(--ymt-primary)',
42
+ boxShadow: '0 0 0 4px rgba(from var(--ymt-primary) r g b / 0.2)',
43
+ borderRadius: '8px',
44
+ opacity: '0',
45
+ transform: 'translateZ(0)'
46
+ // transition: 'opacity 120ms ease, transform 120ms ease, width 120ms ease, height 120ms ease, left 120ms ease, top 120ms ease'
47
+ });
48
+ document.body.appendChild(this.#haloEl);
49
+ }
50
+ #initListeners() {
51
+ document.addEventListener('focus', this.#onFocus, true);
52
+ document.addEventListener('blur', this.#onBlur, true);
53
+ window.addEventListener('scroll', this.#scheduleUpdate, true);
54
+ window.addEventListener('resize', this.#scheduleUpdate);
55
+ document.addEventListener('keydown', this.#onKeydown, true);
56
+ }
57
+ #initObservers() {
58
+ if ('ResizeObserver' in window) {
59
+ this.#resizeObserver = new ResizeObserver(() => {
60
+ if (this.#currentEl)
61
+ this.#scheduleUpdate();
62
+ });
63
+ }
64
+ if ('MutationObserver' in window) {
65
+ this.#mutationObserver = new MutationObserver(() => {
66
+ if (this.#currentEl)
67
+ this.#scheduleUpdate();
68
+ });
69
+ }
70
+ }
71
+ #isFocusable(el) {
72
+ if (!el)
73
+ return false;
74
+ const h = el;
75
+ if (h.tabIndex >= 0)
76
+ return true;
77
+ return /^(A|BUTTON|INPUT|SELECT|TEXTAREA)$/.test(h.tagName) || h.isContentEditable;
78
+ }
79
+ #matchesFocusVisible(el) {
80
+ try {
81
+ return el.matches(':focus-visible');
82
+ }
83
+ catch {
84
+ return true;
85
+ }
86
+ }
87
+ #isElementVisible(el) {
88
+ const rect = el.getBoundingClientRect();
89
+ // Check if element has dimensions
90
+ if (rect.width === 0 || rect.height === 0) {
91
+ return false;
92
+ }
93
+ // Check computed style on element itself
94
+ const style = getComputedStyle(el);
95
+ if (style.visibility === 'hidden' || style.display === 'none' || parseFloat(style.opacity) === 0) {
96
+ return false;
97
+ }
98
+ // Check if element is clipped by overflow:hidden parent OR if any parent is hidden
99
+ return this.#isParentVisible(el, rect);
100
+ }
101
+ #isParentVisible(el, rect) {
102
+ let parent = el.parentElement;
103
+ while (parent && parent !== document.body) {
104
+ const parentStyle = getComputedStyle(parent);
105
+ // Check if parent is hidden
106
+ if (parentStyle.display === 'none' || parentStyle.visibility === 'hidden' || parseFloat(parentStyle.opacity) === 0) {
107
+ return false;
108
+ }
109
+ const parentOverflow = parentStyle.overflow + parentStyle.overflowX + parentStyle.overflowY;
110
+ if (parentOverflow.includes('hidden') || parentOverflow.includes('clip')) {
111
+ const parentRect = parent.getBoundingClientRect();
112
+ // Calculate intersection - if there's no visible area, element is hidden
113
+ const visibleRight = Math.min(rect.right, parentRect.right);
114
+ const visibleLeft = Math.max(rect.left, parentRect.left);
115
+ const visibleBottom = Math.min(rect.bottom, parentRect.bottom);
116
+ const visibleTop = Math.max(rect.top, parentRect.top);
117
+ const visibleWidth = visibleRight - visibleLeft;
118
+ const visibleHeight = visibleBottom - visibleTop;
119
+ // If no intersection or intersection is too small (less than 1px), element is not visible
120
+ if (visibleWidth <= 0 || visibleHeight <= 0) {
121
+ return false;
122
+ }
123
+ }
124
+ parent = parent.parentElement;
125
+ }
126
+ return true;
127
+ }
128
+ #updateHaloRect = () => {
129
+ if (!this.#currentEl || !this.#haloEl || !document.contains(this.#currentEl)) {
130
+ this.#haloEl && (this.#haloEl.style.opacity = '0');
131
+ this.#currentEl = null;
132
+ return;
133
+ }
134
+ // Check if element is actually visible
135
+ if (!this.#isElementVisible(this.#currentEl)) {
136
+ this.#haloEl.style.opacity = '0';
137
+ return;
138
+ }
139
+ const rect = this.#currentEl.getBoundingClientRect();
140
+ const padding = this.#getTargetPadding();
141
+ const left = Math.floor(rect.left - padding);
142
+ const top = Math.floor(rect.top - padding);
143
+ const width = Math.ceil(rect.width + padding * 2);
144
+ const height = Math.ceil(rect.height + padding * 2);
145
+ const cs = getComputedStyle(this.#currentEl);
146
+ this.#haloEl.style.left = `${left}px`;
147
+ this.#haloEl.style.top = `${top}px`;
148
+ this.#haloEl.style.width = `${width}px`;
149
+ this.#haloEl.style.height = `${height}px`;
150
+ this.#haloEl.style.borderRadius = cs.borderRadius || '8px';
151
+ this.#haloEl.style.opacity = '1';
152
+ };
153
+ #getTargetPadding() {
154
+ const parent = this.#currentEl?.parentElement;
155
+ if (parent && this.#noPaddingComponents.includes(parent.nodeName.toLowerCase())) {
156
+ return 0;
157
+ }
158
+ return this.#defaultPadding;
159
+ }
160
+ #scheduleUpdate = () => {
161
+ if (this.#rafId != null)
162
+ cancelAnimationFrame(this.#rafId);
163
+ this.#rafId = requestAnimationFrame(this.#updateHaloRect);
164
+ };
165
+ #onKeydown = (e) => {
166
+ // Track arrow keys and other navigation keys that might move focused element
167
+ const navigationKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End', 'PageUp', 'PageDown'];
168
+ if (this.#currentEl && navigationKeys.includes(e.key)) {
169
+ this.#scheduleUpdate();
170
+ }
171
+ };
172
+ #startTracking(target) {
173
+ this.#currentEl = target;
174
+ this.#scheduleUpdate();
175
+ // Track size changes on target element
176
+ if (this.#resizeObserver) {
177
+ this.#resizeObserver.observe(target);
178
+ // Also observe all parent elements with overflow (they might clip the element)
179
+ let parent = target.parentElement;
180
+ while (parent && parent !== document.body) {
181
+ const style = getComputedStyle(parent);
182
+ const overflow = style.overflow + style.overflowX + style.overflowY;
183
+ if (overflow.includes('hidden') || overflow.includes('clip') || overflow.includes('auto') || overflow.includes('scroll')) {
184
+ this.#resizeObserver.observe(parent);
185
+ }
186
+ parent = parent.parentElement;
187
+ }
188
+ }
189
+ // Track style/attribute changes (for position, transform changes)
190
+ if (this.#mutationObserver) {
191
+ this.#mutationObserver.observe(target, {
192
+ attributes: true,
193
+ attributeFilter: ['style', 'class'],
194
+ subtree: false
195
+ });
196
+ }
197
+ }
198
+ #stopTracking() {
199
+ if (this.#resizeObserver)
200
+ this.#resizeObserver.disconnect();
201
+ if (this.#mutationObserver)
202
+ this.#mutationObserver.disconnect();
203
+ }
204
+ #onFocus = (e) => {
205
+ const target = e.target;
206
+ if (!this.#isFocusable(target))
207
+ return;
208
+ if (!this.#matchesFocusVisible(target)) {
209
+ this.#haloEl && (this.#haloEl.style.opacity = '0');
210
+ this.#currentEl = null;
211
+ return;
212
+ }
213
+ this.#stopTracking();
214
+ this.#startTracking(target);
215
+ };
216
+ #onBlur = (e) => {
217
+ if (e.target === this.#currentEl && this.#haloEl) {
218
+ this.#haloEl.style.opacity = '0';
219
+ this.#currentEl = null;
220
+ this.#stopTracking();
221
+ }
222
+ };
223
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: HaloFocusService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
224
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: HaloFocusService, providedIn: 'root' }); }
225
+ }
226
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: HaloFocusService, decorators: [{
227
+ type: Injectable,
228
+ args: [{
229
+ providedIn: 'root'
230
+ }]
231
+ }] });
232
+
20
233
  class SnackBarService {
21
234
  #snackBar = inject(MatSnackBar);
22
235
  info(message, action) {
@@ -100,9 +313,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
100
313
  }, styles: [":host{display:flex}\n"] }]
101
314
  }] });
102
315
 
316
+ /**
317
+ * Provides and initializes the HaloFocusService.
318
+ * By calling this function in your ApplicationConfig providers,
319
+ * the Halo Focus feature will be activated, allowing users to see a visual focus indicator.
320
+ * The service will be initialized outside Angular zone for optimal performance.
321
+ *
322
+ * @returns EnvironmentProviders
323
+ */
324
+ function provideHaloFocus() {
325
+ return provideAppInitializer(() => {
326
+ const zone = inject(NgZone);
327
+ const haloFocus = inject(HaloFocusService);
328
+ zone.runOutsideAngular(() => haloFocus.init());
329
+ });
330
+ }
331
+
103
332
  /**
104
333
  * Generated bundle index. Do not edit.
105
334
  */
106
335
 
107
- export { SnackBarComponent, SnackBarService, YuuvisClientFrameworkModule };
336
+ export { HaloFocusService, SnackBarComponent, SnackBarService, YuuvisClientFrameworkModule, provideHaloFocus };
108
337
  //# sourceMappingURL=yuuvis-client-framework.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"yuuvis-client-framework.mjs","sources":["../../../../../libs/yuuvis/client-framework/src/lib/yuuvis-client-framework.module.ts","../../../../../libs/yuuvis/client-framework/src/lib/services/snack-bar/snack-bar.service.ts","../../../../../libs/yuuvis/client-framework/src/yuuvis-client-framework.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n imports: [CommonModule],\n})\nexport class YuuvisClientFrameworkModule {}\n","import { Component, inject, Injectable, signal } from '@angular/core';\nimport { MAT_SNACK_BAR_DATA, MatSnackBar, MatSnackBarAction, MatSnackBarActions, MatSnackBarLabel, MatSnackBarRef } from '@angular/material/snack-bar';\nimport { SnackBarData, SnackBarLevel, SnackBarOptions } from './snack-bar.interface';\nimport { MatButtonModule } from '@angular/material/button';\n@Injectable({\n providedIn: 'root'\n})\nexport class SnackBarService {\n #snackBar = inject(MatSnackBar);\n\n info(message: string, action?: string): MatSnackBarRef<SnackBarComponent> {\n return this.snack(message, { action, level: 'info' });\n }\n\n success(message: string, action?: string): MatSnackBarRef<SnackBarComponent> {\n return this.snack(message, { action, level: 'success' });\n }\n\n warning(message: string, action?: string): MatSnackBarRef<SnackBarComponent> {\n return this.snack(message, { action, level: 'warning' });\n }\n\n danger(message: string, action?: string): MatSnackBarRef<SnackBarComponent> {\n return this.snack(message, { action, level: 'danger' });\n }\n\n snack(message: string, options: SnackBarOptions): MatSnackBarRef<SnackBarComponent> {\n return this.#snackBar.openFromComponent(SnackBarComponent, {\n data: {\n level: options.level,\n message,\n action: options.action\n },\n duration: options.duration || 3000,\n horizontalPosition: options.horizontalPosition,\n verticalPosition: options.verticalPosition,\n panelClass: ['yuv-snack-bar', 'level-' + options.level]\n });\n }\n}\n\n@Component({\n selector: 'yuv-snack-bar-component',\n template: `\n <span matSnackBarLabel (click)=\"dismiss()\"> {{ message() }} </span>\n @let a = action();\n @if (a) {\n <span matSnackBarActions>\n <button mat-button matSnackBarAction (click)=\"dismiss(!!a)\">{{ action() }}</button>\n </span>\n }\n `,\n styles: `\n :host {\n display: flex;\n }\n `,\n imports: [MatButtonModule, MatSnackBarLabel, MatSnackBarActions, MatSnackBarAction],\n host: {\n '[class.info]': \"level() === 'info'\",\n '[class.success]': \"level() === 'success'\",\n '[class.warning]': \"level() === 'warning'\",\n '[class.danger]': \"level() === 'danger'\"\n }\n})\nexport class SnackBarComponent {\n #snackBarRef = inject(MatSnackBarRef);\n #snackData = inject<SnackBarData>(MAT_SNACK_BAR_DATA);\n level = signal<SnackBarLevel>(this.#snackData.level);\n message = signal<string>(this.#snackData.message);\n action = signal<string | undefined>(this.#snackData.action);\n\n dismiss(withAction = false) {\n if (withAction) {\n this.#snackBarRef.dismissWithAction();\n } else if (!this.action()) {\n this.#snackBarRef.dismiss();\n }\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":"yuuvis-client-framework.mjs","sources":["../../../../../libs/yuuvis/client-framework/src/lib/yuuvis-client-framework.module.ts","../../../../../libs/yuuvis/client-framework/src/lib/services/halo-focus/halo-focus.service.ts","../../../../../libs/yuuvis/client-framework/src/lib/services/snack-bar/snack-bar.service.ts","../../../../../libs/yuuvis/client-framework/src/lib/providers/halo-focus/provide-halo-focus.ts","../../../../../libs/yuuvis/client-framework/src/yuuvis-client-framework.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n imports: [CommonModule],\n})\nexport class YuuvisClientFrameworkModule {}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HaloFocusService {\n #haloEl: HTMLDivElement | null = null;\n #currentEl: HTMLElement | null = null;\n #rafId: number | null = null; //Request Animation Frame ID\n #resizeObserver?: ResizeObserver;\n #mutationObserver?: MutationObserver;\n\n readonly #defaultPadding = 3;\n readonly #noPaddingComponents = ['yuv-shell-logo'];\n\n init() {\n this.#appendHaloElementToDOM();\n this.#initListeners();\n this.#initObservers();\n }\n\n #appendHaloElementToDOM(): void {\n this.#haloEl = document.createElement('div');\n this.#haloEl.id = 'focus-halo';\n this.#haloEl.setAttribute('aria-hidden', 'true');\n Object.assign(this.#haloEl.style, {\n position: 'fixed',\n pointerEvents: 'none',\n zIndex: '9999',\n border: '2px solid var(--ymt-primary)',\n boxShadow: '0 0 0 4px rgba(from var(--ymt-primary) r g b / 0.2)',\n borderRadius: '8px',\n opacity: '0',\n transform: 'translateZ(0)'\n // transition: 'opacity 120ms ease, transform 120ms ease, width 120ms ease, height 120ms ease, left 120ms ease, top 120ms ease'\n });\n document.body.appendChild(this.#haloEl);\n }\n\n #initListeners(): void {\n document.addEventListener('focus', this.#onFocus, true);\n document.addEventListener('blur', this.#onBlur, true);\n window.addEventListener('scroll', this.#scheduleUpdate, true);\n window.addEventListener('resize', this.#scheduleUpdate);\n document.addEventListener('keydown', this.#onKeydown, true);\n }\n\n #initObservers(): void {\n if ('ResizeObserver' in window) {\n this.#resizeObserver = new ResizeObserver(() => {\n if (this.#currentEl) this.#scheduleUpdate();\n });\n }\n\n if ('MutationObserver' in window) {\n this.#mutationObserver = new MutationObserver(() => {\n if (this.#currentEl) this.#scheduleUpdate();\n });\n }\n }\n\n #isFocusable(el: Element | null): el is HTMLElement {\n if (!el) return false;\n const h = el as HTMLElement;\n if (h.tabIndex >= 0) return true;\n return /^(A|BUTTON|INPUT|SELECT|TEXTAREA)$/.test(h.tagName) || h.isContentEditable;\n }\n\n #matchesFocusVisible(el: HTMLElement): boolean {\n try {\n return el.matches(':focus-visible');\n } catch {\n return true;\n }\n }\n\n #isElementVisible(el: HTMLElement): boolean {\n const rect = el.getBoundingClientRect();\n\n // Check if element has dimensions\n if (rect.width === 0 || rect.height === 0) {\n return false;\n }\n\n // Check computed style on element itself\n const style = getComputedStyle(el);\n if (style.visibility === 'hidden' || style.display === 'none' || parseFloat(style.opacity) === 0) {\n return false;\n }\n\n // Check if element is clipped by overflow:hidden parent OR if any parent is hidden\n return this.#isParentVisible(el, rect);\n }\n\n #isParentVisible(el: HTMLElement, rect: DOMRect): boolean {\n let parent = el.parentElement;\n while (parent && parent !== document.body) {\n const parentStyle = getComputedStyle(parent);\n\n // Check if parent is hidden\n if (parentStyle.display === 'none' || parentStyle.visibility === 'hidden' || parseFloat(parentStyle.opacity) === 0) {\n return false;\n }\n\n const parentOverflow = parentStyle.overflow + parentStyle.overflowX + parentStyle.overflowY;\n\n if (parentOverflow.includes('hidden') || parentOverflow.includes('clip')) {\n const parentRect = parent.getBoundingClientRect();\n // Calculate intersection - if there's no visible area, element is hidden\n const visibleRight = Math.min(rect.right, parentRect.right);\n const visibleLeft = Math.max(rect.left, parentRect.left);\n const visibleBottom = Math.min(rect.bottom, parentRect.bottom);\n const visibleTop = Math.max(rect.top, parentRect.top);\n\n const visibleWidth = visibleRight - visibleLeft;\n const visibleHeight = visibleBottom - visibleTop;\n\n // If no intersection or intersection is too small (less than 1px), element is not visible\n if (visibleWidth <= 0 || visibleHeight <= 0) {\n return false;\n }\n }\n parent = parent.parentElement;\n }\n return true;\n }\n\n #updateHaloRect = () => {\n if (!this.#currentEl || !this.#haloEl || !document.contains(this.#currentEl)) {\n this.#haloEl && (this.#haloEl.style.opacity = '0');\n this.#currentEl = null;\n return;\n }\n\n // Check if element is actually visible\n if (!this.#isElementVisible(this.#currentEl)) {\n this.#haloEl.style.opacity = '0';\n return;\n }\n\n const rect = this.#currentEl.getBoundingClientRect();\n const padding = this.#getTargetPadding();\n\n const left = Math.floor(rect.left - padding);\n const top = Math.floor(rect.top - padding);\n const width = Math.ceil(rect.width + padding * 2);\n const height = Math.ceil(rect.height + padding * 2);\n\n const cs = getComputedStyle(this.#currentEl);\n this.#haloEl.style.left = `${left}px`;\n this.#haloEl.style.top = `${top}px`;\n this.#haloEl.style.width = `${width}px`;\n this.#haloEl.style.height = `${height}px`;\n this.#haloEl.style.borderRadius = cs.borderRadius || '8px';\n this.#haloEl.style.opacity = '1';\n };\n\n #getTargetPadding(): number {\n const parent = this.#currentEl?.parentElement;\n if (parent && this.#noPaddingComponents.includes(parent.nodeName.toLowerCase())) {\n return 0;\n }\n return this.#defaultPadding;\n }\n\n #scheduleUpdate = () => {\n if (this.#rafId != null) cancelAnimationFrame(this.#rafId);\n this.#rafId = requestAnimationFrame(this.#updateHaloRect);\n };\n\n #onKeydown = (e: KeyboardEvent) => {\n // Track arrow keys and other navigation keys that might move focused element\n const navigationKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End', 'PageUp', 'PageDown'];\n if (this.#currentEl && navigationKeys.includes(e.key)) {\n this.#scheduleUpdate();\n }\n };\n\n #startTracking(target: HTMLElement) {\n this.#currentEl = target;\n this.#scheduleUpdate();\n\n // Track size changes on target element\n if (this.#resizeObserver) {\n this.#resizeObserver.observe(target);\n\n // Also observe all parent elements with overflow (they might clip the element)\n let parent = target.parentElement;\n while (parent && parent !== document.body) {\n const style = getComputedStyle(parent);\n const overflow = style.overflow + style.overflowX + style.overflowY;\n if (overflow.includes('hidden') || overflow.includes('clip') || overflow.includes('auto') || overflow.includes('scroll')) {\n this.#resizeObserver.observe(parent);\n }\n parent = parent.parentElement;\n }\n }\n\n // Track style/attribute changes (for position, transform changes)\n if (this.#mutationObserver) {\n this.#mutationObserver.observe(target, {\n attributes: true,\n attributeFilter: ['style', 'class'],\n subtree: false\n });\n }\n }\n\n #stopTracking() {\n if (this.#resizeObserver) this.#resizeObserver.disconnect();\n if (this.#mutationObserver) this.#mutationObserver.disconnect();\n }\n\n #onFocus = (e: FocusEvent) => {\n const target = e.target as HTMLElement;\n if (!this.#isFocusable(target)) return;\n if (!this.#matchesFocusVisible(target)) {\n this.#haloEl && (this.#haloEl.style.opacity = '0');\n this.#currentEl = null;\n return;\n }\n this.#stopTracking();\n this.#startTracking(target);\n };\n\n #onBlur = (e: FocusEvent) => {\n if ((e.target as HTMLElement) === this.#currentEl && this.#haloEl) {\n this.#haloEl.style.opacity = '0';\n this.#currentEl = null;\n this.#stopTracking();\n }\n };\n\n /** Optional: allow manual control from directives/components */\n // public showFor(el: HTMLElement) {\n // this.#currentEl = el;\n // this.#scheduleUpdate();\n // if (this.#ro) {\n // this.#ro.disconnect();\n // this.#ro.observe(el);\n // }\n // }\n\n // public hide() {\n // if (this.#haloEl) this.#haloEl.style.opacity = '0';\n // this.#currentEl = null;\n // if (this.#ro) this.#ro.disconnect();\n // }\n}\n","import { Component, inject, Injectable, signal } from '@angular/core';\nimport { MAT_SNACK_BAR_DATA, MatSnackBar, MatSnackBarAction, MatSnackBarActions, MatSnackBarLabel, MatSnackBarRef } from '@angular/material/snack-bar';\nimport { SnackBarData, SnackBarLevel, SnackBarOptions } from './snack-bar.interface';\nimport { MatButtonModule } from '@angular/material/button';\n@Injectable({\n providedIn: 'root'\n})\nexport class SnackBarService {\n #snackBar = inject(MatSnackBar);\n\n info(message: string, action?: string): MatSnackBarRef<SnackBarComponent> {\n return this.snack(message, { action, level: 'info' });\n }\n\n success(message: string, action?: string): MatSnackBarRef<SnackBarComponent> {\n return this.snack(message, { action, level: 'success' });\n }\n\n warning(message: string, action?: string): MatSnackBarRef<SnackBarComponent> {\n return this.snack(message, { action, level: 'warning' });\n }\n\n danger(message: string, action?: string): MatSnackBarRef<SnackBarComponent> {\n return this.snack(message, { action, level: 'danger' });\n }\n\n snack(message: string, options: SnackBarOptions): MatSnackBarRef<SnackBarComponent> {\n return this.#snackBar.openFromComponent(SnackBarComponent, {\n data: {\n level: options.level,\n message,\n action: options.action\n },\n duration: options.duration || 3000,\n horizontalPosition: options.horizontalPosition,\n verticalPosition: options.verticalPosition,\n panelClass: ['yuv-snack-bar', 'level-' + options.level]\n });\n }\n}\n\n@Component({\n selector: 'yuv-snack-bar-component',\n template: `\n <span matSnackBarLabel (click)=\"dismiss()\"> {{ message() }} </span>\n @let a = action();\n @if (a) {\n <span matSnackBarActions>\n <button mat-button matSnackBarAction (click)=\"dismiss(!!a)\">{{ action() }}</button>\n </span>\n }\n `,\n styles: `\n :host {\n display: flex;\n }\n `,\n imports: [MatButtonModule, MatSnackBarLabel, MatSnackBarActions, MatSnackBarAction],\n host: {\n '[class.info]': \"level() === 'info'\",\n '[class.success]': \"level() === 'success'\",\n '[class.warning]': \"level() === 'warning'\",\n '[class.danger]': \"level() === 'danger'\"\n }\n})\nexport class SnackBarComponent {\n #snackBarRef = inject(MatSnackBarRef);\n #snackData = inject<SnackBarData>(MAT_SNACK_BAR_DATA);\n level = signal<SnackBarLevel>(this.#snackData.level);\n message = signal<string>(this.#snackData.message);\n action = signal<string | undefined>(this.#snackData.action);\n\n dismiss(withAction = false) {\n if (withAction) {\n this.#snackBarRef.dismissWithAction();\n } else if (!this.action()) {\n this.#snackBarRef.dismiss();\n }\n }\n}\n","import { EnvironmentProviders, inject, NgZone, provideAppInitializer } from '@angular/core';\nimport { HaloFocusService } from '../../services';\n\n/**\n * Provides and initializes the HaloFocusService.\n * By calling this function in your ApplicationConfig providers,\n * the Halo Focus feature will be activated, allowing users to see a visual focus indicator.\n * The service will be initialized outside Angular zone for optimal performance.\n *\n * @returns EnvironmentProviders\n */\nexport function provideHaloFocus(): EnvironmentProviders {\n return provideAppInitializer(() => {\n const zone = inject(NgZone);\n const haloFocus = inject(HaloFocusService);\n zone.runOutsideAngular(() => haloFocus.init());\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -34,6 +34,7 @@ export declare class DatetimeComponent extends AbstractMatFormField<Date | null>
34
34
  writeValue(value: any): void;
35
35
  registerOnChange(fn: () => void): void;
36
36
  registerOnTouched(): void;
37
+ setDisabledState?(isDisabled: boolean): void;
37
38
  onValueChange(e: any): void;
38
39
  ngOnInit(): void;
39
40
  static ɵfac: i0.ɵɵFactoryDeclaration<DatetimeComponent, never>;
package/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export * from './lib/yuuvis-client-framework.module';
2
- export * from './lib/services/snack-bar/snack-bar.service';
3
- export * from './lib/services/snack-bar/snack-bar.interface';
2
+ export * from './lib/services';
3
+ export * from './lib/providers';
@@ -0,0 +1,10 @@
1
+ import { EnvironmentProviders } from '@angular/core';
2
+ /**
3
+ * Provides and initializes the HaloFocusService.
4
+ * By calling this function in your ApplicationConfig providers,
5
+ * the Halo Focus feature will be activated, allowing users to see a visual focus indicator.
6
+ * The service will be initialized outside Angular zone for optimal performance.
7
+ *
8
+ * @returns EnvironmentProviders
9
+ */
10
+ export declare function provideHaloFocus(): EnvironmentProviders;
@@ -0,0 +1 @@
1
+ export * from './halo-focus/provide-halo-focus';
@@ -0,0 +1,7 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class HaloFocusService {
3
+ #private;
4
+ init(): void;
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<HaloFocusService, never>;
6
+ static ɵprov: i0.ɵɵInjectableDeclaration<HaloFocusService>;
7
+ }
@@ -0,0 +1,3 @@
1
+ export * from './halo-focus/halo-focus.service';
2
+ export * from './snack-bar/snack-bar.interface';
3
+ export * from './snack-bar/snack-bar.service';
@@ -1,4 +1,5 @@
1
1
  import { Highlightable } from '@angular/cdk/a11y';
2
+ import { AfterViewInit } from '@angular/core';
2
3
  import * as i0 from "@angular/core";
3
4
  /**
4
5
  * Directive for list items. It is used in the `yuvList` component
@@ -12,7 +13,7 @@ import * as i0 from "@angular/core";
12
13
  * </yuv-list>
13
14
  * ```
14
15
  */
15
- export declare class ListItemDirective implements Highlightable {
16
+ export declare class ListItemDirective implements Highlightable, AfterViewInit {
16
17
  #private;
17
18
  onClick?: (evt: MouseEvent) => void;
18
19
  disabled?: boolean | undefined;
@@ -26,9 +27,14 @@ export declare class ListItemDirective implements Highlightable {
26
27
  selected: import("@angular/core").InputSignal<boolean>;
27
28
  selectedInput: import("@angular/core").WritableSignal<any>;
28
29
  activeInput: import("@angular/core").WritableSignal<any>;
30
+ focusableChildren: Element[];
31
+ focusedIndex: number;
29
32
  onHostClick(evt: MouseEvent): void;
30
33
  setActiveStyles(): void;
31
34
  setInactiveStyles(): void;
35
+ focusNext(): void;
36
+ focusPrevious(): void;
37
+ ngAfterViewInit(): void;
32
38
  static ɵfac: i0.ɵɵFactoryDeclaration<ListItemDirective, never>;
33
39
  static ɵdir: i0.ɵɵDirectiveDeclaration<ListItemDirective, "[yuvListItem]", never, { "disabled": { "alias": "disabled"; "required": false; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
34
40
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuuvis/client-framework",
3
- "version": "2.5.2",
3
+ "version": "2.6.0",
4
4
  "author": "OPTIMAL SYSTEMS GmbH <npm@optimal-systems.de>",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
@@ -8,16 +8,16 @@
8
8
  "@angular/common": "^19.2.1",
9
9
  "@angular/core": "^19.2.1",
10
10
  "angular-gridster2": "^19.0.0",
11
- "@yuuvis/client-core": "^2.5.2",
12
- "@yuuvis/client-shell-core": "^2.5.2",
11
+ "@yuuvis/client-core": "^2.6.0",
12
+ "@yuuvis/client-shell-core": "^2.6.0",
13
13
  "ng-dynamic-component": "^10.8.2",
14
14
  "modern-normalize": "^3.0.1"
15
15
  },
16
16
  "dependencies": {
17
17
  "@angular/material": "^19.2.15",
18
18
  "@ngrx/signals": "^19.2.0",
19
- "@yuuvis/material": "2.5.2",
20
- "@yuuvis/media-viewer": "^2.0.11",
19
+ "@yuuvis/material": "2.6.0",
20
+ "@yuuvis/media-viewer": "^2.0.12",
21
21
  "angular-split": "^19.0.0",
22
22
  "vis-network": "^10.0.2",
23
23
  "tslib": "^2.3.0"
@@ -36,14 +36,14 @@
36
36
  "types": "./actions/index.d.ts",
37
37
  "default": "./fesm2022/yuuvis-client-framework-actions.mjs"
38
38
  },
39
- "./autocomplete": {
40
- "types": "./autocomplete/index.d.ts",
41
- "default": "./fesm2022/yuuvis-client-framework-autocomplete.mjs"
42
- },
43
39
  "./app-bar": {
44
40
  "types": "./app-bar/index.d.ts",
45
41
  "default": "./fesm2022/yuuvis-client-framework-app-bar.mjs"
46
42
  },
43
+ "./autocomplete": {
44
+ "types": "./autocomplete/index.d.ts",
45
+ "default": "./fesm2022/yuuvis-client-framework-autocomplete.mjs"
46
+ },
47
47
  "./clipboard": {
48
48
  "types": "./clipboard/index.d.ts",
49
49
  "default": "./fesm2022/yuuvis-client-framework-clipboard.mjs"
@@ -0,0 +1 @@
1
+ export * from './object-type-aggregation.model';
@@ -0,0 +1,14 @@
1
+ export interface ObjectTypeAggregation {
2
+ /**
3
+ * id of a found object type
4
+ */
5
+ objectTypeId: string;
6
+ /**
7
+ * label of an object
8
+ */
9
+ label: string;
10
+ /**
11
+ * number of objects found
12
+ */
13
+ count: number;
14
+ }
@@ -1,31 +1,16 @@
1
- import { EventEmitter } from '@angular/core';
1
+ import { AfterViewInit, ElementRef, EventEmitter } from '@angular/core';
2
2
  import { FormGroup } from '@angular/forms';
3
3
  import { SearchQuery, TranslateService } from '@yuuvis/client-core';
4
+ import { ObjectTypeAggregation } from '../models';
4
5
  import * as i0 from "@angular/core";
5
- export interface ObjectTypeAggregation {
6
- /**
7
- * id of a found object type
8
- */
9
- objectTypeId: string;
10
- /**
11
- * label of an object
12
- */
13
- label: string;
14
- /**
15
- * number of objects found
16
- */
17
- count: number;
18
- }
19
- export declare class SimpleSearchComponent {
6
+ export declare class SimpleSearchComponent implements AfterViewInit {
20
7
  #private;
21
8
  readonly translate: TranslateService;
22
- private _query;
23
9
  /**
24
10
  * The search query
25
11
  */
26
12
  set query(q: SearchQuery | null);
27
13
  get query(): SearchQuery | null;
28
- form: FormGroup;
29
14
  /**
30
15
  * Emitted once the user submits the search
31
16
  */
@@ -40,11 +25,16 @@ export declare class SimpleSearchComponent {
40
25
  targetSelectionChanged: EventEmitter<(string | number)[]>;
41
26
  queryChange: EventEmitter<SearchQuery>;
42
27
  typeAggregation: EventEmitter<ObjectTypeAggregation[]>;
43
- constructor();
44
- search(): void;
45
- aggregate(all?: boolean): void;
46
- clear($event: Event): void;
47
- private _processAggregateResult;
28
+ searchInput: ElementRef<HTMLInputElement>;
29
+ form: FormGroup;
30
+ private _query;
31
+ ngAfterViewInit(): void;
32
+ private subscribeToTargetsChanges;
33
+ private subscribeToSearchFormChanges;
34
+ private aggregate;
35
+ onSearch(): void;
36
+ onClear($event: Event): void;
37
+ private handleAggregateResult;
48
38
  static ɵfac: i0.ɵɵFactoryDeclaration<SimpleSearchComponent, never>;
49
39
  static ɵcmp: i0.ɵɵComponentDeclaration<SimpleSearchComponent, "yuv-simple-search", never, { "query": { "alias": "query"; "required": false; }; }, { "querySubmit": "querySubmit"; "clearInput": "clearInput"; "targetSelectionChanged": "targetSelectionChanged"; "queryChange": "queryChange"; "typeAggregation": "typeAggregation"; }, never, never, true, never>;
50
40
  }
@@ -0,0 +1,15 @@
1
+ import * as i0 from "@angular/core";
2
+ /**
3
+ * Directive to add a cover overlay to a split area during dragging.
4
+ * This is useful when the split area contains elements like iframes
5
+ * that can capture drag events and interfere with the split view's
6
+ * dragging functionality.
7
+ * The overlay will be transparent and therefore not recognized by
8
+ * the user, but will capture the drag events.
9
+ */
10
+ export declare class SplitAreaCoverDirective {
11
+ #private;
12
+ yuvSplitAreaCover: import("@angular/core").InputSignal<boolean>;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<SplitAreaCoverDirective, never>;
14
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SplitAreaCoverDirective, "[yuvSplitAreaCover]", never, { "yuvSplitAreaCover": { "alias": "yuvSplitAreaCover"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
15
+ }