@acorex/components 22.0.0-next.8 → 22.0.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 (120) hide show
  1. package/combo-box/README.md +35 -0
  2. package/fesm2022/acorex-components-accordion.mjs +2 -2
  3. package/fesm2022/acorex-components-accordion.mjs.map +1 -1
  4. package/fesm2022/acorex-components-action-sheet.mjs +1 -0
  5. package/fesm2022/acorex-components-action-sheet.mjs.map +1 -1
  6. package/fesm2022/acorex-components-alert.mjs +2 -2
  7. package/fesm2022/acorex-components-alert.mjs.map +1 -1
  8. package/fesm2022/acorex-components-button.mjs +4 -4
  9. package/fesm2022/acorex-components-button.mjs.map +1 -1
  10. package/fesm2022/acorex-components-calendar.mjs +10 -12
  11. package/fesm2022/acorex-components-calendar.mjs.map +1 -1
  12. package/fesm2022/acorex-components-check-box.mjs +2 -2
  13. package/fesm2022/acorex-components-check-box.mjs.map +1 -1
  14. package/fesm2022/acorex-components-combo-box.mjs +783 -0
  15. package/fesm2022/acorex-components-combo-box.mjs.map +1 -0
  16. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-DCcRJYfF.mjs +50 -0
  17. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-DCcRJYfF.mjs.map +1 -0
  18. package/fesm2022/{acorex-components-conversation-open-composer-picker-for-files-Hh5Oyp3p.mjs → acorex-components-conversation-open-composer-picker-for-files-DnSW908R.mjs} +7 -20
  19. package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-DnSW908R.mjs.map +1 -0
  20. package/fesm2022/acorex-components-conversation.mjs +9946 -17396
  21. package/fesm2022/acorex-components-conversation.mjs.map +1 -1
  22. package/fesm2022/acorex-components-data-table.mjs +188 -64
  23. package/fesm2022/acorex-components-data-table.mjs.map +1 -1
  24. package/fesm2022/acorex-components-datetime-box.mjs +14 -16
  25. package/fesm2022/acorex-components-datetime-box.mjs.map +1 -1
  26. package/fesm2022/acorex-components-datetime-input.mjs +61 -32
  27. package/fesm2022/acorex-components-datetime-input.mjs.map +1 -1
  28. package/fesm2022/acorex-components-decorators.mjs +21 -5
  29. package/fesm2022/acorex-components-decorators.mjs.map +1 -1
  30. package/fesm2022/acorex-components-dialog.mjs +7 -4
  31. package/fesm2022/acorex-components-dialog.mjs.map +1 -1
  32. package/fesm2022/acorex-components-drawer.mjs +2 -2
  33. package/fesm2022/acorex-components-drawer.mjs.map +1 -1
  34. package/fesm2022/acorex-components-dropdown.mjs +4 -4
  35. package/fesm2022/acorex-components-dropdown.mjs.map +1 -1
  36. package/fesm2022/acorex-components-fab.mjs +5 -5
  37. package/fesm2022/acorex-components-fab.mjs.map +1 -1
  38. package/fesm2022/acorex-components-file-viewer.mjs +38 -78
  39. package/fesm2022/acorex-components-file-viewer.mjs.map +1 -1
  40. package/fesm2022/acorex-components-form.mjs +21 -5
  41. package/fesm2022/acorex-components-form.mjs.map +1 -1
  42. package/fesm2022/acorex-components-grid-layout-builder.mjs +238 -36
  43. package/fesm2022/acorex-components-grid-layout-builder.mjs.map +1 -1
  44. package/fesm2022/acorex-components-label.mjs +2 -2
  45. package/fesm2022/acorex-components-label.mjs.map +1 -1
  46. package/fesm2022/acorex-components-list.mjs +2 -2
  47. package/fesm2022/acorex-components-list.mjs.map +1 -1
  48. package/fesm2022/acorex-components-loading-dialog.mjs +59 -42
  49. package/fesm2022/acorex-components-loading-dialog.mjs.map +1 -1
  50. package/fesm2022/acorex-components-lookup.mjs +2897 -0
  51. package/fesm2022/acorex-components-lookup.mjs.map +1 -0
  52. package/fesm2022/acorex-components-map.mjs +2 -2
  53. package/fesm2022/acorex-components-map.mjs.map +1 -1
  54. package/fesm2022/acorex-components-menu.mjs +238 -75
  55. package/fesm2022/acorex-components-menu.mjs.map +1 -1
  56. package/fesm2022/acorex-components-notification.mjs +13 -6
  57. package/fesm2022/acorex-components-notification.mjs.map +1 -1
  58. package/fesm2022/acorex-components-number-box.mjs +30 -29
  59. package/fesm2022/acorex-components-number-box.mjs.map +1 -1
  60. package/fesm2022/acorex-components-password-box.mjs +3 -3
  61. package/fesm2022/acorex-components-password-box.mjs.map +1 -1
  62. package/fesm2022/acorex-components-popover.mjs +29 -6
  63. package/fesm2022/acorex-components-popover.mjs.map +1 -1
  64. package/fesm2022/acorex-components-popup.mjs +4 -2
  65. package/fesm2022/acorex-components-popup.mjs.map +1 -1
  66. package/fesm2022/acorex-components-radio.mjs +2 -2
  67. package/fesm2022/acorex-components-radio.mjs.map +1 -1
  68. package/fesm2022/acorex-components-range-slider.mjs +2 -2
  69. package/fesm2022/acorex-components-range-slider.mjs.map +1 -1
  70. package/fesm2022/acorex-components-scheduler.mjs +12 -22
  71. package/fesm2022/acorex-components-scheduler.mjs.map +1 -1
  72. package/fesm2022/acorex-components-select-box.mjs +55 -18
  73. package/fesm2022/acorex-components-select-box.mjs.map +1 -1
  74. package/fesm2022/acorex-components-selection-list.mjs +2 -2
  75. package/fesm2022/acorex-components-selection-list.mjs.map +1 -1
  76. package/fesm2022/acorex-components-switch.mjs +2 -2
  77. package/fesm2022/acorex-components-switch.mjs.map +1 -1
  78. package/fesm2022/acorex-components-tabs.mjs +2 -2
  79. package/fesm2022/acorex-components-tabs.mjs.map +1 -1
  80. package/fesm2022/acorex-components-tag-box.mjs +2 -2
  81. package/fesm2022/acorex-components-tag-box.mjs.map +1 -1
  82. package/fesm2022/acorex-components-text-area.mjs +2 -2
  83. package/fesm2022/acorex-components-text-area.mjs.map +1 -1
  84. package/fesm2022/acorex-components-toast.mjs +9 -2
  85. package/fesm2022/acorex-components-toast.mjs.map +1 -1
  86. package/fesm2022/acorex-components-tooltip.mjs +2 -2
  87. package/fesm2022/acorex-components-tooltip.mjs.map +1 -1
  88. package/fesm2022/acorex-components-tree-view.mjs +40 -3
  89. package/fesm2022/acorex-components-tree-view.mjs.map +1 -1
  90. package/lookup/README.md +74 -0
  91. package/package.json +12 -7
  92. package/select-box/README.md +5 -0
  93. package/types/acorex-components-action-sheet.d.ts +9 -1
  94. package/types/acorex-components-combo-box.d.ts +280 -0
  95. package/types/acorex-components-conversation.d.ts +947 -1354
  96. package/types/acorex-components-data-table.d.ts +47 -5
  97. package/types/acorex-components-datetime-box.d.ts +2 -0
  98. package/types/acorex-components-datetime-input.d.ts +24 -5
  99. package/types/acorex-components-decorators.d.ts +1 -0
  100. package/types/acorex-components-dialog.d.ts +9 -0
  101. package/types/acorex-components-file-viewer.d.ts +15 -52
  102. package/types/acorex-components-grid-layout-builder.d.ts +34 -2
  103. package/types/acorex-components-loading-dialog.d.ts +12 -4
  104. package/types/acorex-components-lookup.d.ts +831 -0
  105. package/types/acorex-components-menu.d.ts +28 -4
  106. package/types/acorex-components-notification.d.ts +11 -1
  107. package/types/acorex-components-number-box.d.ts +3 -1
  108. package/types/acorex-components-popover.d.ts +10 -1
  109. package/types/acorex-components-popup.d.ts +9 -1
  110. package/types/acorex-components-scheduler.d.ts +2 -4
  111. package/types/acorex-components-select-box.d.ts +21 -4
  112. package/types/acorex-components-toast.d.ts +10 -1
  113. package/types/acorex-components-tree-view.d.ts +9 -1
  114. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-CNHiM1Sp.mjs +0 -106
  115. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-CNHiM1Sp.mjs.map +0 -1
  116. package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-Hh5Oyp3p.mjs.map +0 -1
  117. package/fesm2022/acorex-components-selection-list-2.mjs +0 -168
  118. package/fesm2022/acorex-components-selection-list-2.mjs.map +0 -1
  119. package/selection-list-2/README.md +0 -3
  120. package/types/acorex-components-selection-list-2.d.ts +0 -52
@@ -1,4 +1,5 @@
1
1
  import { NXClickEvent, NXComponent, AXComponent, NXEvent } from '@acorex/cdk/common';
2
+ import { resolveVisualContext, applyVisualContext } from '@acorex/cdk/overlay';
2
3
  import { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';
3
4
  import { isBrowser } from '@acorex/core/platform';
4
5
  import { AXTranslatorPipe } from '@acorex/core/translation';
@@ -105,6 +106,16 @@ class AXMenuItemClickBaseEvent extends NXClickEvent {
105
106
  }
106
107
  }
107
108
 
109
+ /** Edge padding when clamping floating menu panels to the viewport. */
110
+ const AX_MENU_VIEWPORT_MARGIN = 8;
111
+ /** Limits a fixed menu panel so it stays within the viewport below `top`. */
112
+ function axFitMenuPanelHeight(renderer, el, top) {
113
+ renderer.setStyle(el, 'max-height', `${Math.max(0, window.innerHeight - top - AX_MENU_VIEWPORT_MARGIN)}px`);
114
+ }
115
+ function axClearMenuPanelHeight(renderer, el) {
116
+ renderer.removeStyle(el, 'max-height');
117
+ }
118
+
108
119
  /**
109
120
  * Represents a menu item component used within an `ax-menu`.
110
121
  * @category Components
@@ -139,8 +150,16 @@ class AXMenuItemComponent extends NXComponent {
139
150
  this.unsuscriber = inject(AXUnsubscriber);
140
151
  this.renderer = inject(Renderer2);
141
152
  this.injector = inject(Injector);
153
+ this.document = inject(DOCUMENT);
142
154
  this.zIndexService = inject(AXZIndexService);
143
155
  this.zToken = null;
156
+ this.submenuPortalParent = null;
157
+ this.submenuPortalNextSibling = null;
158
+ /** Survives submenu portaling when the DOM parent chain is broken. */
159
+ this.linkedParent = null;
160
+ this.mouseLeaveTimeout = null;
161
+ this.submenuUnlistenEnter = null;
162
+ this.submenuUnlistenLeave = null;
144
163
  this.arrowIcon = computed(() => {
145
164
  const isRtl = AXHtmlUtil.isRtl(this.nativeElement);
146
165
  return this.root.orientation() == 'horizontal' && this.isFirstLevel()
@@ -159,12 +178,12 @@ class AXMenuItemComponent extends NXComponent {
159
178
  ...(ngDevMode ? [undefined, { debugName: "disabled" }] : /* istanbul ignore next */ []));
160
179
  this.color = input(/* @ts-ignore */
161
180
  ...(ngDevMode ? [undefined, { debugName: "color" }] : /* istanbul ignore next */ []));
162
- this.mouseLeaveTimeout = null;
163
181
  afterNextRender(() => {
164
182
  if (!isPlatformBrowser(this.platformId)) {
165
183
  return;
166
184
  }
167
185
  this.reparentOrphanedChildren();
186
+ this.linkChildItems();
168
187
  this.updateDiscoveredSubmenuNodeCount();
169
188
  this.childObserver = new MutationObserver((records) => {
170
189
  if (!this.hasRelevantChildMutation(records)) {
@@ -185,6 +204,10 @@ class AXMenuItemComponent extends NXComponent {
185
204
  this.service.close$.pipe(this.unsuscriber.takeUntilDestroy).subscribe((item) => {
186
205
  if (this == item) {
187
206
  this.isOpen.set(false);
207
+ this.clearCloseTimeout();
208
+ this.restoreSubmenuPortal();
209
+ this.zIndexService.release(this.zToken);
210
+ this.zToken = null;
188
211
  }
189
212
  });
190
213
  }
@@ -192,10 +215,13 @@ class AXMenuItemComponent extends NXComponent {
192
215
  return this.nativeElement.querySelector('ax-text')?.innerText;
193
216
  }
194
217
  /**
195
- * Resolves the parent menu item. Items rendered via recursive `ngTemplateOutlet` do not
196
- * receive a DI parent, so we fall back to the DOM tree after reparenting.
218
+ * Resolves the parent menu item. Prefers an explicit link (survives submenu portaling),
219
+ * then DI, then the DOM tree.
197
220
  */
198
221
  getParentMenuItem() {
222
+ if (this.linkedParent) {
223
+ return this.linkedParent;
224
+ }
199
225
  if (this.parent) {
200
226
  return this.parent;
201
227
  }
@@ -203,8 +229,7 @@ class AXMenuItemComponent extends NXComponent {
203
229
  if (!parentHost || parentHost === this.nativeElement) {
204
230
  return null;
205
231
  }
206
- const ctx = parentHost.__axContext__;
207
- return ctx instanceof AXMenuItemComponent ? ctx : null;
232
+ return this.getInstanceFromElement(parentHost) ?? null;
208
233
  }
209
234
  /**
210
235
  * Opens the submenu of this menu item if it has sub-items and is not disabled.
@@ -214,7 +239,13 @@ class AXMenuItemComponent extends NXComponent {
214
239
  return;
215
240
  }
216
241
  this.reparentOrphanedChildren();
242
+ this.linkChildItems();
217
243
  this.service.closeExcept(this);
244
+ const submenu = this.submenuSlot()?.nativeElement;
245
+ if (submenu) {
246
+ // Portal before `isOpen` so ancestor overflow cannot clip the first paint.
247
+ this.portalSubmenu(submenu);
248
+ }
218
249
  if (!this.zToken) {
219
250
  this.zToken = this.zIndexService.acquire();
220
251
  }
@@ -224,9 +255,8 @@ class AXMenuItemComponent extends NXComponent {
224
255
  * Closes the submenu of this menu item if open.
225
256
  */
226
257
  close() {
258
+ this.clearCloseTimeout();
227
259
  this.service.markClosed(this);
228
- this.zIndexService.release(this.zToken);
229
- this.zToken = null;
230
260
  }
231
261
  /**
232
262
  * Positions the submenu after layout so nested levels measure their full height.
@@ -245,30 +275,35 @@ class AXMenuItemComponent extends NXComponent {
245
275
  }
246
276
  /**
247
277
  * Calculate the position of the submenu to avoid it going out of the viewport.
278
+ * Tall panels are height-clamped; the panel is portaled so parent overflow cannot clip it.
248
279
  */
249
280
  calculatePosition() {
250
281
  const submenu = this.submenuSlot()?.nativeElement;
251
282
  if (!submenu)
252
283
  return;
284
+ this.portalSubmenu(submenu);
285
+ axClearMenuPanelHeight(this.renderer, submenu);
253
286
  const submenuRect = this.measureSubmenuRect(submenu);
254
287
  const itemRect = this.nativeElement.getBoundingClientRect();
255
288
  const windowWidth = window.innerWidth;
256
289
  const windowHeight = window.innerHeight;
290
+ const margin = AX_MENU_VIEWPORT_MARGIN;
257
291
  const isRtl = AXHtmlUtil.isRtl(this.nativeElement);
292
+ const effectiveHeight = Math.min(submenuRect.height, Math.max(0, windowHeight - margin * 2));
258
293
  let finalTop;
259
294
  let finalLeft;
260
295
  const preferredTop = this.isFirstLevel() && this.root.orientation() === 'horizontal' ? itemRect.bottom : itemRect.top;
261
- const alternateTop = itemRect.top - submenuRect.height;
262
- if (preferredTop + submenuRect.height <= windowHeight) {
296
+ const alternateTop = itemRect.top - effectiveHeight;
297
+ if (preferredTop + effectiveHeight <= windowHeight - margin) {
263
298
  finalTop = preferredTop;
264
299
  }
265
- else if (alternateTop >= 0) {
300
+ else if (alternateTop >= margin) {
266
301
  finalTop = alternateTop;
267
302
  }
268
303
  else {
269
- finalTop = windowHeight - submenuRect.height;
304
+ finalTop = margin;
270
305
  }
271
- finalTop = this.clampVerticalPosition(finalTop, submenuRect.height, windowHeight);
306
+ finalTop = this.clampVerticalPosition(finalTop, effectiveHeight, windowHeight, margin);
272
307
  if (this.isFirstLevel() && this.root.orientation() === 'horizontal') {
273
308
  const preferredLeft = isRtl ? itemRect.right - submenuRect.width : itemRect.left;
274
309
  const alternateLeft = isRtl ? itemRect.left : itemRect.right - submenuRect.width;
@@ -280,47 +315,30 @@ class AXMenuItemComponent extends NXComponent {
280
315
  }
281
316
  }
282
317
  else {
283
- const preferredLeftRtl = itemRect.left - submenuRect.width;
284
- const alternateLeftRtl = itemRect.right;
285
- const preferredLeftLtr = itemRect.right;
286
- const alternateLeftLtr = itemRect.left - submenuRect.width;
287
- if (isRtl) {
288
- if (preferredLeftRtl >= 0) {
289
- finalLeft = preferredLeftRtl;
290
- }
291
- else if (alternateLeftRtl + submenuRect.width <= windowWidth) {
292
- finalLeft = alternateLeftRtl;
293
- }
294
- else {
295
- finalLeft = 0;
296
- }
318
+ const preferredLeft = isRtl ? itemRect.left - submenuRect.width : itemRect.right;
319
+ const alternateLeft = isRtl ? itemRect.right : itemRect.left - submenuRect.width;
320
+ if (isRtl ? preferredLeft >= 0 : preferredLeft + submenuRect.width <= windowWidth) {
321
+ finalLeft = preferredLeft;
322
+ }
323
+ else if (isRtl ? alternateLeft + submenuRect.width <= windowWidth : alternateLeft >= 0) {
324
+ finalLeft = alternateLeft;
297
325
  }
298
326
  else {
299
- if (preferredLeftLtr + submenuRect.width <= windowWidth) {
300
- finalLeft = preferredLeftLtr;
301
- }
302
- else if (alternateLeftLtr >= 0) {
303
- finalLeft = alternateLeftLtr;
304
- }
305
- else {
306
- finalLeft = windowWidth - submenuRect.width;
307
- }
327
+ finalLeft = isRtl ? 0 : windowWidth - submenuRect.width;
308
328
  }
309
329
  }
310
330
  const isNestedMenu = !(this.isFirstLevel() && this.root.orientation() === 'horizontal');
311
331
  if (isNestedMenu) {
312
332
  const overlapsParent = finalLeft < itemRect.right && itemRect.left < finalLeft + submenuRect.width;
313
- if (overlapsParent) {
314
- const shiftedTop = itemRect.bottom;
315
- if (shiftedTop + submenuRect.height <= windowHeight) {
316
- finalTop = shiftedTop;
317
- }
333
+ if (overlapsParent && itemRect.bottom + effectiveHeight <= windowHeight - margin) {
334
+ finalTop = itemRect.bottom;
318
335
  }
319
336
  }
320
- finalTop = this.clampVerticalPosition(finalTop, submenuRect.height, windowHeight);
337
+ finalTop = this.clampVerticalPosition(finalTop, effectiveHeight, windowHeight, margin);
321
338
  this.renderer.setStyle(submenu, 'position', 'fixed');
322
339
  this.renderer.setStyle(submenu, 'top', `${finalTop}px`);
323
340
  this.renderer.setStyle(submenu, 'left', `${finalLeft}px`);
341
+ axFitMenuPanelHeight(this.renderer, submenu, finalTop);
324
342
  if (this.zToken) {
325
343
  this.renderer.setStyle(submenu, 'z-index', String(this.zToken.zIndex));
326
344
  }
@@ -334,6 +352,83 @@ class AXMenuItemComponent extends NXComponent {
334
352
  this.renderer.removeStyle(submenu, 'display');
335
353
  return rect;
336
354
  }
355
+ /** Moves the submenu under the context-menu backdrop (or body) to escape ancestor overflow. */
356
+ portalSubmenu(submenu) {
357
+ if (!isPlatformBrowser(this.platformId)) {
358
+ return;
359
+ }
360
+ submenu.__axMenuOwner__ = this;
361
+ this.bindSubmenuPointerListeners(submenu);
362
+ if (this.submenuPortalParent) {
363
+ return;
364
+ }
365
+ const parent = submenu.parentElement;
366
+ if (!parent) {
367
+ return;
368
+ }
369
+ this.submenuPortalParent = parent;
370
+ this.submenuPortalNextSibling = submenu.nextSibling;
371
+ const rootEl = this.root.nativeElement;
372
+ const rootParent = rootEl.parentElement;
373
+ const portalHost = rootEl.tagName === 'AX-CONTEXT-MENU' && rootParent && rootParent !== this.document.body
374
+ ? rootParent
375
+ : this.document.body;
376
+ if (submenu.parentElement !== portalHost) {
377
+ portalHost.appendChild(submenu);
378
+ }
379
+ }
380
+ restoreSubmenuPortal() {
381
+ const submenu = this.submenuSlot()?.nativeElement;
382
+ this.unbindSubmenuPointerListeners();
383
+ if (submenu) {
384
+ axClearMenuPanelHeight(this.renderer, submenu);
385
+ delete submenu.__axMenuOwner__;
386
+ }
387
+ if (submenu && this.submenuPortalParent) {
388
+ try {
389
+ this.submenuPortalParent.insertBefore(submenu, this.submenuPortalNextSibling);
390
+ }
391
+ catch {
392
+ // Host may already be torn down while the context menu is closing.
393
+ }
394
+ }
395
+ this.submenuPortalParent = null;
396
+ this.submenuPortalNextSibling = null;
397
+ }
398
+ /** Keep this item open while the pointer is over its portaled submenu panel. */
399
+ bindSubmenuPointerListeners(submenu) {
400
+ this.unbindSubmenuPointerListeners();
401
+ this.submenuUnlistenEnter = this.renderer.listen(submenu, 'mouseenter', () => {
402
+ this.clearCloseTimeout();
403
+ this.clearAncestorCloseTimeouts();
404
+ });
405
+ this.submenuUnlistenLeave = this.renderer.listen(submenu, 'mouseleave', (event) => {
406
+ this.handlePointerLeave(event);
407
+ });
408
+ }
409
+ unbindSubmenuPointerListeners() {
410
+ this.submenuUnlistenEnter?.();
411
+ this.submenuUnlistenLeave?.();
412
+ this.submenuUnlistenEnter = null;
413
+ this.submenuUnlistenLeave = null;
414
+ }
415
+ /** Links direct children so parent resolution still works after the panel is portaled. */
416
+ linkChildItems() {
417
+ const submenu = this.submenuSlot()?.nativeElement;
418
+ if (!submenu) {
419
+ return;
420
+ }
421
+ submenu.querySelectorAll(':scope > ax-menu-item').forEach((el) => {
422
+ const child = this.getInstanceFromElement(el);
423
+ if (child) {
424
+ child.linkedParent = this;
425
+ }
426
+ });
427
+ }
428
+ getInstanceFromElement(el) {
429
+ const ctx = el.__axContext__;
430
+ return ctx instanceof AXMenuItemComponent ? ctx : undefined;
431
+ }
337
432
  /**
338
433
  * Moves nested `ax-menu-item` nodes rendered by recursive `ngTemplateOutlet` templates
339
434
  * into the submenu slot. Angular content queries do not traverse those embedded views.
@@ -369,7 +464,13 @@ class AXMenuItemComponent extends NXComponent {
369
464
  });
370
465
  }
371
466
  updateDiscoveredSubmenuNodeCount() {
372
- this.discoveredSubmenuNodeCount.set(this.getDirectSubmenuNodes().length);
467
+ const fromHost = this.getDirectSubmenuNodes().length;
468
+ const submenu = this.submenuSlot()?.nativeElement;
469
+ const fromPanel = submenu
470
+ ? submenu.querySelectorAll(':scope > ax-menu-item, :scope > ax-title, :scope > ax-divider').length
471
+ : 0;
472
+ // After portaling, projected children live in the panel outside this host.
473
+ this.discoveredSubmenuNodeCount.set(Math.max(fromHost, fromPanel));
373
474
  }
374
475
  scheduleChildRefresh() {
375
476
  if (this.childRefreshScheduled) {
@@ -379,6 +480,7 @@ class AXMenuItemComponent extends NXComponent {
379
480
  requestAnimationFrame(() => {
380
481
  this.childRefreshScheduled = false;
381
482
  this.reparentOrphanedChildren();
483
+ this.linkChildItems();
382
484
  this.updateDiscoveredSubmenuNodeCount();
383
485
  });
384
486
  }
@@ -407,12 +509,12 @@ class AXMenuItemComponent extends NXComponent {
407
509
  return false;
408
510
  }
409
511
  /** Keeps the submenu fully inside the viewport vertically. */
410
- clampVerticalPosition(top, height, windowHeight) {
411
- if (top + height > windowHeight) {
412
- top = windowHeight - height;
512
+ clampVerticalPosition(top, height, windowHeight, margin = 0) {
513
+ if (top + height > windowHeight - margin) {
514
+ top = windowHeight - margin - height;
413
515
  }
414
- if (top < 0) {
415
- top = 0;
516
+ if (top < margin) {
517
+ top = margin;
416
518
  }
417
519
  return top;
418
520
  }
@@ -442,16 +544,17 @@ class AXMenuItemComponent extends NXComponent {
442
544
  }
443
545
  handleMouseEnter(event) {
444
546
  event.stopPropagation();
445
- if (this.mouseLeaveTimeout) {
446
- clearTimeout(this.mouseLeaveTimeout);
447
- this.mouseLeaveTimeout = null;
448
- }
547
+ this.clearCloseTimeout();
548
+ this.clearAncestorCloseTimeouts();
449
549
  if (!this.isFirstLevel() || this.root.openOn() == 'hover') {
450
550
  this.open();
451
551
  }
452
552
  }
453
553
  handleMouseLeave(event) {
454
554
  event.stopPropagation();
555
+ this.handlePointerLeave(event);
556
+ }
557
+ handlePointerLeave(event) {
455
558
  if (!this.hasSubItems() || this.root.closeOn() !== 'leave') {
456
559
  return;
457
560
  }
@@ -459,25 +562,54 @@ class AXMenuItemComponent extends NXComponent {
459
562
  if (relatedTarget instanceof Node && this.containsSubmenuPointer(relatedTarget)) {
460
563
  return;
461
564
  }
462
- if (this.mouseLeaveTimeout) {
463
- clearTimeout(this.mouseLeaveTimeout);
464
- }
565
+ this.scheduleClose();
566
+ }
567
+ scheduleClose() {
568
+ this.clearCloseTimeout();
465
569
  this.mouseLeaveTimeout = setTimeout(() => {
570
+ this.mouseLeaveTimeout = null;
466
571
  this.close();
467
572
  }, 500);
468
573
  }
469
- /** True when the pointer moved into this item's submenu panel or a nested open submenu. */
574
+ clearCloseTimeout() {
575
+ if (this.mouseLeaveTimeout) {
576
+ clearTimeout(this.mouseLeaveTimeout);
577
+ this.mouseLeaveTimeout = null;
578
+ }
579
+ }
580
+ clearAncestorCloseTimeouts() {
581
+ let current = this.getParentMenuItem();
582
+ while (current) {
583
+ current.clearCloseTimeout();
584
+ current = current.getParentMenuItem();
585
+ }
586
+ }
587
+ /** True when the pointer is still inside this item's submenu tree (including portaled panels). */
470
588
  containsSubmenuPointer(node) {
471
- const submenu = this.submenuSlot()?.nativeElement;
472
- if (submenu?.contains(node)) {
589
+ if (this.submenuSlot()?.nativeElement?.contains(node) || this.nativeElement.contains(node)) {
473
590
  return true;
474
591
  }
475
- if (this.nativeElement.contains(node)) {
476
- return true;
592
+ const el = node instanceof Element ? node : node.parentElement;
593
+ if (!el) {
594
+ return false;
595
+ }
596
+ const item = this.getInstanceFromElement(el.closest('ax-menu-item') ?? el) ??
597
+ el.closest('.ax-menu-items')?.__axMenuOwner__;
598
+ return !!item && this.isSelfOrAncestorOf(item);
599
+ }
600
+ isSelfOrAncestorOf(item) {
601
+ let current = item;
602
+ while (current) {
603
+ if (current === this) {
604
+ return true;
605
+ }
606
+ current = current.getParentMenuItem();
477
607
  }
478
- return this.getDirectSubmenuNodes().some((child) => child.contains(node));
608
+ return false;
479
609
  }
480
610
  ngOnDestroy() {
611
+ this.clearCloseTimeout();
612
+ this.unbindSubmenuPointerListeners();
481
613
  if (this.isOpen()) {
482
614
  this.close();
483
615
  }
@@ -488,7 +620,7 @@ class AXMenuItemComponent extends NXComponent {
488
620
  if (this.disabled()) {
489
621
  list.push('ax-state-disabled');
490
622
  }
491
- list.push(`${this.color() ?? 'ax-default'}`);
623
+ list.push(resolveMenuItemColorClass(this.color()));
492
624
  return list;
493
625
  }
494
626
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
@@ -530,6 +662,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
530
662
  type: HostBinding,
531
663
  args: ['class']
532
664
  }] } });
665
+ function resolveMenuItemColorClass(color) {
666
+ if (!color || color === 'default') {
667
+ return 'ax-default';
668
+ }
669
+ return `ax-${color}`;
670
+ }
533
671
 
534
672
  class AXContextMenuOpeningEvent extends NXEvent {
535
673
  constructor() {
@@ -643,6 +781,7 @@ class AXContextMenuComponent extends NXComponent {
643
781
  const wasOpen = this.nativeElement.classList.contains('ax-state-open');
644
782
  this.nativeElement.classList.remove('ax-state-open');
645
783
  this.lastOpenPoint = null;
784
+ axClearMenuPanelHeight(this.renderer, this.nativeElement);
646
785
  // Drop rendered items before moving DOM nodes back to the original parent.
647
786
  // This prevents a large menu tree from being re-parented/removed as a single heavy DOM operation.
648
787
  if (wasOpen) {
@@ -739,6 +878,7 @@ class AXContextMenuComponent extends NXComponent {
739
878
  const itemRect = this.measureMenuRect(elementRef);
740
879
  const windowWidth = window.innerWidth;
741
880
  const windowHeight = window.innerHeight;
881
+ const margin = AX_MENU_VIEWPORT_MARGIN;
742
882
  const isRtl = AXHtmlUtil.isRtl(elementRef);
743
883
  let left;
744
884
  if (isRtl) {
@@ -753,23 +893,22 @@ class AXContextMenuComponent extends NXComponent {
753
893
  left = point.x - itemRect.width;
754
894
  }
755
895
  }
756
- const bottom = point.y + itemRect.height;
757
- let top;
758
- if (bottom > windowHeight) {
759
- top = point.y - itemRect.height;
760
- if (top < 0) {
761
- top = 0;
762
- }
896
+ const effectiveHeight = Math.min(itemRect.height, Math.max(0, windowHeight - margin * 2));
897
+ let top = point.y;
898
+ if (top + effectiveHeight > windowHeight - margin) {
899
+ top = windowHeight - margin - effectiveHeight;
763
900
  }
764
- else {
765
- top = point.y;
901
+ if (top < margin) {
902
+ top = margin;
766
903
  }
767
904
  this.renderer.setStyle(elementRef, 'left', `${left}px`);
768
905
  this.renderer.setStyle(elementRef, 'top', `${top}px`);
769
906
  this.renderer.setStyle(elementRef, 'position', 'fixed');
907
+ axFitMenuPanelHeight(this.renderer, elementRef, top);
770
908
  }
771
909
  /** Measures menu size even when an ancestor hides the host with `display: none`. */
772
910
  measureMenuRect(elementRef) {
911
+ axClearMenuPanelHeight(this.renderer, elementRef);
773
912
  this.renderer.setStyle(elementRef, 'visibility', 'hidden');
774
913
  this.renderer.setStyle(elementRef, 'display', 'flex');
775
914
  const rect = elementRef.getBoundingClientRect();
@@ -796,6 +935,26 @@ class AXContextMenuComponent extends NXComponent {
796
935
  this.createEventListeners(this.backdropElement);
797
936
  this.document.body.appendChild(this.backdropElement);
798
937
  this.backdropElement.appendChild(this.nativeElement);
938
+ const contextSource = this.resolveContextMenuTarget();
939
+ const context = resolveVisualContext(contextSource, this.document.documentElement);
940
+ applyVisualContext(this.backdropElement, context);
941
+ applyVisualContext(this.nativeElement, context);
942
+ }
943
+ /** @ignore */
944
+ resolveContextMenuTarget() {
945
+ const target = this.target();
946
+ if (!target) {
947
+ return this.document.documentElement;
948
+ }
949
+ if (typeof target === 'string') {
950
+ const el = this.document.querySelector(target);
951
+ return el instanceof HTMLElement ? el : this.document.documentElement;
952
+ }
953
+ if (Array.isArray(target)) {
954
+ const first = target[0];
955
+ return first instanceof HTMLElement ? first : this.document.documentElement;
956
+ }
957
+ return target;
799
958
  }
800
959
  /** @ignore */
801
960
  removeBackdrop() {
@@ -814,7 +973,11 @@ class AXContextMenuComponent extends NXComponent {
814
973
  this.close();
815
974
  l1();
816
975
  });
817
- const l2 = this.renderer.listen(el, 'wheel', () => {
976
+ const l2 = this.renderer.listen(el, 'wheel', (e) => {
977
+ const target = e.target;
978
+ if (target instanceof Element && (this.nativeElement.contains(target) || target.closest('.ax-menu-items'))) {
979
+ return;
980
+ }
818
981
  this.close();
819
982
  l2();
820
983
  });
@@ -870,7 +1033,7 @@ class AXContextMenuComponent extends NXComponent {
870
1033
  provide: AXComponent,
871
1034
  useExisting: AXContextMenuComponent,
872
1035
  },
873
- ], usesInheritance: true, ngImport: i0, template: "<ng-content select=\"ax-menu-item,ax-divider,ax-title,ng-container\"></ng-content>\n\n@for (node of items(); track node) {\n <ng-container [ngTemplateOutlet]=\"Recursion\" [ngTemplateOutletContext]=\"{ $implicit: node }\"> </ng-container>\n}\n\n<ng-template #Recursion let-item>\n @if (item.group?.title) {\n <ax-title>{{ item.group?.title }}</ax-title>\n }\n <ax-menu-item\n [name]=\"item.name\"\n [data]=\"item.data\"\n [disabled]=\"item.disabled\"\n [color]=\"item.color\"\n [subItems]=\"item.items ?? []\"\n >\n @if (item.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"item.icon\"> </ax-icon>\n </ax-prefix>\n }\n @if (item.text) {\n <ax-text>{{ item.text | translate | async }}</ax-text>\n }\n @if (item.suffix) {\n <ax-suffix>\n <ax-text>{{ item.suffix.text | translate | async }}</ax-text>\n </ax-suffix>\n }\n @for (child of item.items; track child) {\n <ng-container [ngTemplateOutlet]=\"Recursion\" [ngTemplateOutletContext]=\"{ $implicit: child }\"></ng-container>\n }\n </ax-menu-item>\n @if (item.break) {\n <ax-divider></ax-divider>\n }\n</ng-template>\n", styles: ["@layer properties;@layer components{ax-context-menu,ax-menu{display:flex;width:max-content;color:inherit}:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items{visibility:hidden;position:fixed;display:flex;height:max-content;width:max-content;flex-direction:column;border-style:var(--tw-border-style);border-width:1px;--tw-border-style: solid;border-style:solid;padding-block:calc(var(--spacing, .25rem) * 2);opacity:0%;transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s));min-width:calc(var(--spacing, .25rem) * 48);border-radius:var(--radius-default, var(--ax-sys-border-radius));border-color:var(--color-border-lightest, rgba(var(--ax-sys-color-border-lightest-surface)));background-color:var(--color-lightest, rgba(var(--ax-sys-color-lightest-surface)));color:var(--color-on-lightest, rgba(var(--ax-sys-color-on-lightest-surface)));box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a;transition-duration:var(--ax-sys-transition-duration);transition-timing-function:var(--ax-sys-transition-timing-function)}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items).ax-state-open{visibility:visible;opacity:100%}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items) ax-menu-item{color:var(--ax-comp-bg)}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled){background-color:var(--ax-comp-bg);color:var(--ax-comp-bg)}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled) ax-suffix ax-text{color:var(--ax-comp-bg)}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items) ax-menu-item ax-suffix ax-text{--tw-font-weight: var(--font-weight-normal, 400) !important;font-weight:var(--font-weight-normal, 400)!important}ax-context-menu.ax-action-list-horizontal{padding-inline:calc(var(--spacing, .25rem) * 4)}ax-menu>ax-menu-item:has(>.ax-action-item-suffix:not(:empty)){gap:calc(var(--spacing, .25rem) * 2)}ax-menu.ax-action-list-horizontal{min-width:calc(var(--spacing, .25rem) * 48);gap:calc(var(--spacing, .25rem) * 5)}ax-menu.ax-action-list-horizontal>ax-title{display:none}ax-menu.ax-action-list-horizontal>ax-menu-item{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-menu.ax-action-list-horizontal>ax-menu-item>.ax-action-item-prefix{padding-inline-start:calc(var(--spacing, .25rem) * 0)!important}ax-menu.ax-action-list-horizontal>ax-menu-item>.ax-action-item-suffix:not(ax-menu.ax-action-list-horizontal>ax-menu-item .ax-action-item-suffix:empty){margin-inline-end:calc(var(--spacing, .25rem) * 0)!important;padding-inline-start:calc(var(--spacing, .25rem) * 0)!important}ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled){background-color:transparent!important}ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled)>.ax-action-item-prefix,ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled)>.ax-action-item-suffix{opacity:70%}ax-menu.ax-action-list-vertical{width:max-content;min-width:calc(var(--spacing, .25rem) * 48)}ax-menu.ax-action-list-vertical>ax-menu-item{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled){background-color:transparent!important}ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled)>.ax-action-item-prefix,ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled)>.ax-action-item-suffix{opacity:70%}ax-menu>ax-menu-item{padding-block:calc(var(--spacing, .25rem) * 2)}ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled){border-radius:var(--radius-default, var(--ax-sys-border-radius))}ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled)>ax-icon,ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled)>ax-text{opacity:70%}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "component", type: AXMenuItemComponent, selector: "ax-menu-item", inputs: ["subItems", "name", "data", "disabled", "color"], outputs: ["onClick"] }, { kind: "component", type: AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
1036
+ ], usesInheritance: true, ngImport: i0, template: "<ng-content select=\"ax-menu-item,ax-divider,ax-title,ng-container\"></ng-content>\n\n@for (node of items(); track node) {\n <ng-container [ngTemplateOutlet]=\"Recursion\" [ngTemplateOutletContext]=\"{ $implicit: node }\"> </ng-container>\n}\n\n<ng-template #Recursion let-item>\n @if (item.group?.title) {\n <ax-title>{{ item.group?.title }}</ax-title>\n }\n <ax-menu-item\n [name]=\"item.name\"\n [data]=\"item.data\"\n [disabled]=\"item.disabled\"\n [color]=\"item.color\"\n [subItems]=\"item.items ?? []\"\n >\n @if (item.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"item.icon\"> </ax-icon>\n </ax-prefix>\n }\n @if (item.text) {\n <ax-text>{{ item.text | translate | async }}</ax-text>\n }\n @if (item.suffix) {\n <ax-suffix>\n <ax-text>{{ item.suffix.text | translate | async }}</ax-text>\n </ax-suffix>\n }\n @for (child of item.items; track child) {\n <ng-container [ngTemplateOutlet]=\"Recursion\" [ngTemplateOutletContext]=\"{ $implicit: child }\"></ng-container>\n }\n </ax-menu-item>\n @if (item.break) {\n <ax-divider></ax-divider>\n }\n</ng-template>\n", styles: ["@layer properties;@layer components{ax-context-menu,ax-menu,.ax-menu-items{--ax-comp-menu-items-min-width: 12rem;--ax-comp-menu-action-list-hover-decorator-opacity: .7;--ax-comp-menu-action-list-horizontal-min-width: 12rem;--ax-comp-menu-action-list-horizontal-gap: 1.25rem;--ax-comp-menu-action-list-vertical-min-width: 12rem}ax-context-menu,ax-menu{display:flex;width:max-content;color:inherit}ax-context-menu.ax-menu-container,.ax-menu-items{--ax-comp-menu-shadow-rest: var(--ax-sys-effect-overlay);--ax-comp-menu-inner-border-rest: var(--ax-sys-inner-border-surface);--ax-comp-menu-contrast-inner-border-rest: var(--ax-sys-contrast-inner-border-surface);--ax-comp-menu-contrast-surface-overlay-rest: var(--ax-sys-contrast-surface-overlay-surface);--ax-comp-menu-backdrop-filter-rest: var(--ax-sys-backdrop-filter-surface);--ax-comp-menu-surface-overlay-rest: var(--ax-sys-surface-overlay-overlay);--ax-comp-action-item-padding-inline: .875rem;opacity:0;display:flex;position:fixed;visibility:hidden;width:max-content;height:max-content;max-height:calc(100dvh - 1rem);flex-direction:column;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;min-width:var(--ax-comp-menu-items-min-width);color:rgba(var(--ax-comp-menu-items-text-color, var(--ax-sys-color-on-lightest-surface)));background-color:rgba(var(--ax-comp-menu-sub-item-bg-color, var(--ax-sys-color-lightest-surface)));background-image:linear-gradient(var(--ax-comp-menu-contrast-surface-overlay-rest),var(--ax-comp-menu-contrast-surface-overlay-rest)),linear-gradient(var(--ax-comp-menu-surface-overlay-rest),var(--ax-comp-menu-surface-overlay-rest));padding-block:var(--ax-comp-menu-items-padding-block, .5rem);border-width:var(--ax-comp-menu-items-border-width, 1px);border-style:solid;border-radius:var(--ax-comp-menu-items-border-radius, var(--ax-sys-border-radius));border-color:rgba(var(--ax-comp-menu-items-border-color, var(--ax-sys-color-border-lightest-surface)));box-shadow:var(--ax-comp-menu-contrast-inner-border-rest),var(--ax-comp-menu-inner-border-rest),var(--ax-comp-menu-shadow-rest);backdrop-filter:var(--ax-comp-menu-backdrop-filter-rest);-webkit-backdrop-filter:var(--ax-comp-menu-backdrop-filter-rest);transition-property:opacity,color;transition-duration:var(--ax-sys-transition-duration);transition-timing-function:var(--ax-sys-transition-timing-function)}:is(ax-context-menu.ax-menu-container,.ax-menu-items).ax-state-open{opacity:1;visibility:visible}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item{color:rgba(var(--ax-comp-menu-item-text-color, var(--ax-sys-color-on-surface)))}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item.ax-danger{color:var(--ax-comp-bg)}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item.ax-danger ax-prefix,:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item.ax-danger ax-suffix ax-text{color:inherit}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item ax-suffix ax-text{color:rgba(var(--ax-comp-menu-item-suffix-text-color));--tw-font-weight: var(--font-weight-normal, 400) !important;font-weight:var(--font-weight-normal, 400)!important}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled){color:rgba(var(--ax-comp-menu-item-hover-text-color, var(--ax-sys-color-on-surface)));background-color:rgba(var(--ax-comp-menu-item-hover-bg-color, var(--ax-sys-color-surface)))!important}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled).ax-danger{color:var(--ax-comp-bg)}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled) ax-suffix ax-text{color:rgba(var(--ax-comp-menu-item-hover-suffix-text-color))}ax-context-menu.ax-action-list-horizontal{padding-inline:var(--ax-comp-menu-action-list-horizontal-padding-inline, 1rem)}ax-menu>ax-menu-item{--ax-comp-action-item-padding-inline: 0;padding-block:var(--ax-comp-menu-items-padding-block, .5rem)}ax-menu>ax-menu-item:has(>.ax-action-item-suffix:not(:empty)){gap:.5rem}ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled){border-radius:var(--ax-comp-menu-items-border-radius, var(--ax-sys-border-radius))}ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled)>ax-icon,ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled)>ax-text{opacity:var(--ax-comp-menu-action-list-hover-decorator-opacity)}ax-menu.ax-action-list-horizontal{min-width:var(--ax-comp-menu-action-list-horizontal-min-width);gap:var(--ax-comp-menu-action-list-horizontal-gap)}ax-menu.ax-action-list-horizontal>ax-title{display:none}ax-menu.ax-action-list-horizontal>ax-menu-item{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-menu.ax-action-list-horizontal>ax-menu-item>.ax-action-item-prefix{padding-inline-start:calc(var(--spacing, .25rem) * 0)!important}ax-menu.ax-action-list-horizontal>ax-menu-item>.ax-action-item-suffix:not(ax-menu.ax-action-list-horizontal>ax-menu-item .ax-action-item-suffix:empty){padding-inline-end:0!important;margin-inline-start:0!important}ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled){background-color:transparent!important}ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled)>.ax-action-item-prefix,ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled)>.ax-action-item-suffix{opacity:var(--ax-comp-menu-action-list-hover-decorator-opacity)}ax-menu.ax-action-list-vertical{width:max-content;min-width:var(--ax-comp-menu-action-list-vertical-min-width)}ax-menu.ax-action-list-vertical>ax-menu-item{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled){background-color:transparent!important}ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled)>.ax-action-item-prefix,ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled)>.ax-action-item-suffix{opacity:var(--ax-comp-menu-action-list-hover-decorator-opacity)}}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "component", type: AXMenuItemComponent, selector: "ax-menu-item", inputs: ["subItems", "name", "data", "disabled", "color"], outputs: ["onClick"] }, { kind: "component", type: AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
874
1037
  }
875
1038
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXContextMenuComponent, decorators: [{
876
1039
  type: Component,
@@ -891,7 +1054,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
891
1054
  AXDecoratorIconComponent,
892
1055
  AsyncPipe,
893
1056
  AXTranslatorPipe,
894
- ], template: "<ng-content select=\"ax-menu-item,ax-divider,ax-title,ng-container\"></ng-content>\n\n@for (node of items(); track node) {\n <ng-container [ngTemplateOutlet]=\"Recursion\" [ngTemplateOutletContext]=\"{ $implicit: node }\"> </ng-container>\n}\n\n<ng-template #Recursion let-item>\n @if (item.group?.title) {\n <ax-title>{{ item.group?.title }}</ax-title>\n }\n <ax-menu-item\n [name]=\"item.name\"\n [data]=\"item.data\"\n [disabled]=\"item.disabled\"\n [color]=\"item.color\"\n [subItems]=\"item.items ?? []\"\n >\n @if (item.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"item.icon\"> </ax-icon>\n </ax-prefix>\n }\n @if (item.text) {\n <ax-text>{{ item.text | translate | async }}</ax-text>\n }\n @if (item.suffix) {\n <ax-suffix>\n <ax-text>{{ item.suffix.text | translate | async }}</ax-text>\n </ax-suffix>\n }\n @for (child of item.items; track child) {\n <ng-container [ngTemplateOutlet]=\"Recursion\" [ngTemplateOutletContext]=\"{ $implicit: child }\"></ng-container>\n }\n </ax-menu-item>\n @if (item.break) {\n <ax-divider></ax-divider>\n }\n</ng-template>\n", styles: ["@layer properties;@layer components{ax-context-menu,ax-menu{display:flex;width:max-content;color:inherit}:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items{visibility:hidden;position:fixed;display:flex;height:max-content;width:max-content;flex-direction:column;border-style:var(--tw-border-style);border-width:1px;--tw-border-style: solid;border-style:solid;padding-block:calc(var(--spacing, .25rem) * 2);opacity:0%;transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s));min-width:calc(var(--spacing, .25rem) * 48);border-radius:var(--radius-default, var(--ax-sys-border-radius));border-color:var(--color-border-lightest, rgba(var(--ax-sys-color-border-lightest-surface)));background-color:var(--color-lightest, rgba(var(--ax-sys-color-lightest-surface)));color:var(--color-on-lightest, rgba(var(--ax-sys-color-on-lightest-surface)));box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a;transition-duration:var(--ax-sys-transition-duration);transition-timing-function:var(--ax-sys-transition-timing-function)}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items).ax-state-open{visibility:visible;opacity:100%}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items) ax-menu-item{color:var(--ax-comp-bg)}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled){background-color:var(--ax-comp-bg);color:var(--ax-comp-bg)}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled) ax-suffix ax-text{color:var(--ax-comp-bg)}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items) ax-menu-item ax-suffix ax-text{--tw-font-weight: var(--font-weight-normal, 400) !important;font-weight:var(--font-weight-normal, 400)!important}ax-context-menu.ax-action-list-horizontal{padding-inline:calc(var(--spacing, .25rem) * 4)}ax-menu>ax-menu-item:has(>.ax-action-item-suffix:not(:empty)){gap:calc(var(--spacing, .25rem) * 2)}ax-menu.ax-action-list-horizontal{min-width:calc(var(--spacing, .25rem) * 48);gap:calc(var(--spacing, .25rem) * 5)}ax-menu.ax-action-list-horizontal>ax-title{display:none}ax-menu.ax-action-list-horizontal>ax-menu-item{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-menu.ax-action-list-horizontal>ax-menu-item>.ax-action-item-prefix{padding-inline-start:calc(var(--spacing, .25rem) * 0)!important}ax-menu.ax-action-list-horizontal>ax-menu-item>.ax-action-item-suffix:not(ax-menu.ax-action-list-horizontal>ax-menu-item .ax-action-item-suffix:empty){margin-inline-end:calc(var(--spacing, .25rem) * 0)!important;padding-inline-start:calc(var(--spacing, .25rem) * 0)!important}ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled){background-color:transparent!important}ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled)>.ax-action-item-prefix,ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled)>.ax-action-item-suffix{opacity:70%}ax-menu.ax-action-list-vertical{width:max-content;min-width:calc(var(--spacing, .25rem) * 48)}ax-menu.ax-action-list-vertical>ax-menu-item{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled){background-color:transparent!important}ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled)>.ax-action-item-prefix,ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled)>.ax-action-item-suffix{opacity:70%}ax-menu>ax-menu-item{padding-block:calc(var(--spacing, .25rem) * 2)}ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled){border-radius:var(--radius-default, var(--ax-sys-border-radius))}ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled)>ax-icon,ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled)>ax-text{opacity:70%}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
1057
+ ], template: "<ng-content select=\"ax-menu-item,ax-divider,ax-title,ng-container\"></ng-content>\n\n@for (node of items(); track node) {\n <ng-container [ngTemplateOutlet]=\"Recursion\" [ngTemplateOutletContext]=\"{ $implicit: node }\"> </ng-container>\n}\n\n<ng-template #Recursion let-item>\n @if (item.group?.title) {\n <ax-title>{{ item.group?.title }}</ax-title>\n }\n <ax-menu-item\n [name]=\"item.name\"\n [data]=\"item.data\"\n [disabled]=\"item.disabled\"\n [color]=\"item.color\"\n [subItems]=\"item.items ?? []\"\n >\n @if (item.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"item.icon\"> </ax-icon>\n </ax-prefix>\n }\n @if (item.text) {\n <ax-text>{{ item.text | translate | async }}</ax-text>\n }\n @if (item.suffix) {\n <ax-suffix>\n <ax-text>{{ item.suffix.text | translate | async }}</ax-text>\n </ax-suffix>\n }\n @for (child of item.items; track child) {\n <ng-container [ngTemplateOutlet]=\"Recursion\" [ngTemplateOutletContext]=\"{ $implicit: child }\"></ng-container>\n }\n </ax-menu-item>\n @if (item.break) {\n <ax-divider></ax-divider>\n }\n</ng-template>\n", styles: ["@layer properties;@layer components{ax-context-menu,ax-menu,.ax-menu-items{--ax-comp-menu-items-min-width: 12rem;--ax-comp-menu-action-list-hover-decorator-opacity: .7;--ax-comp-menu-action-list-horizontal-min-width: 12rem;--ax-comp-menu-action-list-horizontal-gap: 1.25rem;--ax-comp-menu-action-list-vertical-min-width: 12rem}ax-context-menu,ax-menu{display:flex;width:max-content;color:inherit}ax-context-menu.ax-menu-container,.ax-menu-items{--ax-comp-menu-shadow-rest: var(--ax-sys-effect-overlay);--ax-comp-menu-inner-border-rest: var(--ax-sys-inner-border-surface);--ax-comp-menu-contrast-inner-border-rest: var(--ax-sys-contrast-inner-border-surface);--ax-comp-menu-contrast-surface-overlay-rest: var(--ax-sys-contrast-surface-overlay-surface);--ax-comp-menu-backdrop-filter-rest: var(--ax-sys-backdrop-filter-surface);--ax-comp-menu-surface-overlay-rest: var(--ax-sys-surface-overlay-overlay);--ax-comp-action-item-padding-inline: .875rem;opacity:0;display:flex;position:fixed;visibility:hidden;width:max-content;height:max-content;max-height:calc(100dvh - 1rem);flex-direction:column;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;min-width:var(--ax-comp-menu-items-min-width);color:rgba(var(--ax-comp-menu-items-text-color, var(--ax-sys-color-on-lightest-surface)));background-color:rgba(var(--ax-comp-menu-sub-item-bg-color, var(--ax-sys-color-lightest-surface)));background-image:linear-gradient(var(--ax-comp-menu-contrast-surface-overlay-rest),var(--ax-comp-menu-contrast-surface-overlay-rest)),linear-gradient(var(--ax-comp-menu-surface-overlay-rest),var(--ax-comp-menu-surface-overlay-rest));padding-block:var(--ax-comp-menu-items-padding-block, .5rem);border-width:var(--ax-comp-menu-items-border-width, 1px);border-style:solid;border-radius:var(--ax-comp-menu-items-border-radius, var(--ax-sys-border-radius));border-color:rgba(var(--ax-comp-menu-items-border-color, var(--ax-sys-color-border-lightest-surface)));box-shadow:var(--ax-comp-menu-contrast-inner-border-rest),var(--ax-comp-menu-inner-border-rest),var(--ax-comp-menu-shadow-rest);backdrop-filter:var(--ax-comp-menu-backdrop-filter-rest);-webkit-backdrop-filter:var(--ax-comp-menu-backdrop-filter-rest);transition-property:opacity,color;transition-duration:var(--ax-sys-transition-duration);transition-timing-function:var(--ax-sys-transition-timing-function)}:is(ax-context-menu.ax-menu-container,.ax-menu-items).ax-state-open{opacity:1;visibility:visible}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item{color:rgba(var(--ax-comp-menu-item-text-color, var(--ax-sys-color-on-surface)))}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item.ax-danger{color:var(--ax-comp-bg)}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item.ax-danger ax-prefix,:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item.ax-danger ax-suffix ax-text{color:inherit}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item ax-suffix ax-text{color:rgba(var(--ax-comp-menu-item-suffix-text-color));--tw-font-weight: var(--font-weight-normal, 400) !important;font-weight:var(--font-weight-normal, 400)!important}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled){color:rgba(var(--ax-comp-menu-item-hover-text-color, var(--ax-sys-color-on-surface)));background-color:rgba(var(--ax-comp-menu-item-hover-bg-color, var(--ax-sys-color-surface)))!important}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled).ax-danger{color:var(--ax-comp-bg)}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled) ax-suffix ax-text{color:rgba(var(--ax-comp-menu-item-hover-suffix-text-color))}ax-context-menu.ax-action-list-horizontal{padding-inline:var(--ax-comp-menu-action-list-horizontal-padding-inline, 1rem)}ax-menu>ax-menu-item{--ax-comp-action-item-padding-inline: 0;padding-block:var(--ax-comp-menu-items-padding-block, .5rem)}ax-menu>ax-menu-item:has(>.ax-action-item-suffix:not(:empty)){gap:.5rem}ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled){border-radius:var(--ax-comp-menu-items-border-radius, var(--ax-sys-border-radius))}ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled)>ax-icon,ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled)>ax-text{opacity:var(--ax-comp-menu-action-list-hover-decorator-opacity)}ax-menu.ax-action-list-horizontal{min-width:var(--ax-comp-menu-action-list-horizontal-min-width);gap:var(--ax-comp-menu-action-list-horizontal-gap)}ax-menu.ax-action-list-horizontal>ax-title{display:none}ax-menu.ax-action-list-horizontal>ax-menu-item{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-menu.ax-action-list-horizontal>ax-menu-item>.ax-action-item-prefix{padding-inline-start:calc(var(--spacing, .25rem) * 0)!important}ax-menu.ax-action-list-horizontal>ax-menu-item>.ax-action-item-suffix:not(ax-menu.ax-action-list-horizontal>ax-menu-item .ax-action-item-suffix:empty){padding-inline-end:0!important;margin-inline-start:0!important}ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled){background-color:transparent!important}ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled)>.ax-action-item-prefix,ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled)>.ax-action-item-suffix{opacity:var(--ax-comp-menu-action-list-hover-decorator-opacity)}ax-menu.ax-action-list-vertical{width:max-content;min-width:var(--ax-comp-menu-action-list-vertical-min-width)}ax-menu.ax-action-list-vertical>ax-menu-item{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled){background-color:transparent!important}ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled)>.ax-action-item-prefix,ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled)>.ax-action-item-suffix{opacity:var(--ax-comp-menu-action-list-hover-decorator-opacity)}}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
895
1058
  }], ctorParameters: () => [], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], openOn: [{ type: i0.Input, args: [{ isSignal: true, alias: "openOn", required: false }] }], closeOn: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOn", required: false }] }], closeOnRouteChange: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnRouteChange", required: false }] }], originalItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], target: [{ type: i0.Input, args: [{ isSignal: true, alias: "target", required: false }] }], onItemClick: [{ type: i0.Output, args: ["onItemClick"] }], onOpening: [{ type: i0.Output, args: ["onOpening"] }], onClose: [{ type: i0.Output, args: ["onClose"] }], onWindowEvent: [{
896
1059
  type: HostListener,
897
1060
  args: ['window:scroll']
@@ -954,7 +1117,7 @@ class AXMenuComponent extends NXComponent {
954
1117
  provide: AXComponent,
955
1118
  useExisting: AXMenuComponent,
956
1119
  },
957
- ], usesInheritance: true, ngImport: i0, template: "<ng-content select=\"ax-menu-item,ax-divider,ax-title,ng-container\"></ng-content>\n\n@for (node of items(); track node) {\n <ng-container [ngTemplateOutlet]=\"Recursion\" [ngTemplateOutletContext]=\"{ $implicit: node }\"> </ng-container>\n}\n\n<ng-template #Recursion let-item>\n @if (item.group?.title) {\n <ax-title>{{ item.group?.title }}</ax-title>\n }\n <ax-menu-item\n [name]=\"item.name\"\n [data]=\"item.data\"\n [disabled]=\"item.disabled\"\n [color]=\"item.color\"\n [subItems]=\"item.items ?? []\"\n >\n @if (item.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"item.icon\"> </ax-icon>\n </ax-prefix>\n }\n @if (item.text) {\n <ax-text>{{ item.text | translate | async }}</ax-text>\n }\n @if (item.suffix) {\n <ax-suffix>\n <ax-text>{{ item.suffix.text | translate | async }}</ax-text>\n </ax-suffix>\n }\n @for (child of item.items; track child) {\n <ng-container [ngTemplateOutlet]=\"Recursion\" [ngTemplateOutletContext]=\"{ $implicit: child }\"></ng-container>\n }\n </ax-menu-item>\n @if (item.break) {\n <ax-divider></ax-divider>\n }\n</ng-template>\n", styles: ["@layer properties;@layer components{ax-context-menu,ax-menu{display:flex;width:max-content;color:inherit}:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items{visibility:hidden;position:fixed;display:flex;height:max-content;width:max-content;flex-direction:column;border-style:var(--tw-border-style);border-width:1px;--tw-border-style: solid;border-style:solid;padding-block:calc(var(--spacing, .25rem) * 2);opacity:0%;transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s));min-width:calc(var(--spacing, .25rem) * 48);border-radius:var(--radius-default, var(--ax-sys-border-radius));border-color:var(--color-border-lightest, rgba(var(--ax-sys-color-border-lightest-surface)));background-color:var(--color-lightest, rgba(var(--ax-sys-color-lightest-surface)));color:var(--color-on-lightest, rgba(var(--ax-sys-color-on-lightest-surface)));box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a;transition-duration:var(--ax-sys-transition-duration);transition-timing-function:var(--ax-sys-transition-timing-function)}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items).ax-state-open{visibility:visible;opacity:100%}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items) ax-menu-item{color:var(--ax-comp-bg)}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled){background-color:var(--ax-comp-bg);color:var(--ax-comp-bg)}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled) ax-suffix ax-text{color:var(--ax-comp-bg)}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items) ax-menu-item ax-suffix ax-text{--tw-font-weight: var(--font-weight-normal, 400) !important;font-weight:var(--font-weight-normal, 400)!important}ax-context-menu.ax-action-list-horizontal{padding-inline:calc(var(--spacing, .25rem) * 4)}ax-menu>ax-menu-item:has(>.ax-action-item-suffix:not(:empty)){gap:calc(var(--spacing, .25rem) * 2)}ax-menu.ax-action-list-horizontal{min-width:calc(var(--spacing, .25rem) * 48);gap:calc(var(--spacing, .25rem) * 5)}ax-menu.ax-action-list-horizontal>ax-title{display:none}ax-menu.ax-action-list-horizontal>ax-menu-item{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-menu.ax-action-list-horizontal>ax-menu-item>.ax-action-item-prefix{padding-inline-start:calc(var(--spacing, .25rem) * 0)!important}ax-menu.ax-action-list-horizontal>ax-menu-item>.ax-action-item-suffix:not(ax-menu.ax-action-list-horizontal>ax-menu-item .ax-action-item-suffix:empty){margin-inline-end:calc(var(--spacing, .25rem) * 0)!important;padding-inline-start:calc(var(--spacing, .25rem) * 0)!important}ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled){background-color:transparent!important}ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled)>.ax-action-item-prefix,ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled)>.ax-action-item-suffix{opacity:70%}ax-menu.ax-action-list-vertical{width:max-content;min-width:calc(var(--spacing, .25rem) * 48)}ax-menu.ax-action-list-vertical>ax-menu-item{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled){background-color:transparent!important}ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled)>.ax-action-item-prefix,ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled)>.ax-action-item-suffix{opacity:70%}ax-menu>ax-menu-item{padding-block:calc(var(--spacing, .25rem) * 2)}ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled){border-radius:var(--radius-default, var(--ax-sys-border-radius))}ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled)>ax-icon,ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled)>ax-text{opacity:70%}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "component", type: AXMenuItemComponent, selector: "ax-menu-item", inputs: ["subItems", "name", "data", "disabled", "color"], outputs: ["onClick"] }, { kind: "component", type: AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
1120
+ ], usesInheritance: true, ngImport: i0, template: "<ng-content select=\"ax-menu-item,ax-divider,ax-title,ng-container\"></ng-content>\n\n@for (node of items(); track node) {\n <ng-container [ngTemplateOutlet]=\"Recursion\" [ngTemplateOutletContext]=\"{ $implicit: node }\"> </ng-container>\n}\n\n<ng-template #Recursion let-item>\n @if (item.group?.title) {\n <ax-title>{{ item.group?.title }}</ax-title>\n }\n <ax-menu-item\n [name]=\"item.name\"\n [data]=\"item.data\"\n [disabled]=\"item.disabled\"\n [color]=\"item.color\"\n [subItems]=\"item.items ?? []\"\n >\n @if (item.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"item.icon\"> </ax-icon>\n </ax-prefix>\n }\n @if (item.text) {\n <ax-text>{{ item.text | translate | async }}</ax-text>\n }\n @if (item.suffix) {\n <ax-suffix>\n <ax-text>{{ item.suffix.text | translate | async }}</ax-text>\n </ax-suffix>\n }\n @for (child of item.items; track child) {\n <ng-container [ngTemplateOutlet]=\"Recursion\" [ngTemplateOutletContext]=\"{ $implicit: child }\"></ng-container>\n }\n </ax-menu-item>\n @if (item.break) {\n <ax-divider></ax-divider>\n }\n</ng-template>\n", styles: ["@layer properties;@layer components{ax-context-menu,ax-menu,.ax-menu-items{--ax-comp-menu-items-min-width: 12rem;--ax-comp-menu-action-list-hover-decorator-opacity: .7;--ax-comp-menu-action-list-horizontal-min-width: 12rem;--ax-comp-menu-action-list-horizontal-gap: 1.25rem;--ax-comp-menu-action-list-vertical-min-width: 12rem}ax-context-menu,ax-menu{display:flex;width:max-content;color:inherit}ax-context-menu.ax-menu-container,.ax-menu-items{--ax-comp-menu-shadow-rest: var(--ax-sys-effect-overlay);--ax-comp-menu-inner-border-rest: var(--ax-sys-inner-border-surface);--ax-comp-menu-contrast-inner-border-rest: var(--ax-sys-contrast-inner-border-surface);--ax-comp-menu-contrast-surface-overlay-rest: var(--ax-sys-contrast-surface-overlay-surface);--ax-comp-menu-backdrop-filter-rest: var(--ax-sys-backdrop-filter-surface);--ax-comp-menu-surface-overlay-rest: var(--ax-sys-surface-overlay-overlay);--ax-comp-action-item-padding-inline: .875rem;opacity:0;display:flex;position:fixed;visibility:hidden;width:max-content;height:max-content;max-height:calc(100dvh - 1rem);flex-direction:column;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;min-width:var(--ax-comp-menu-items-min-width);color:rgba(var(--ax-comp-menu-items-text-color, var(--ax-sys-color-on-lightest-surface)));background-color:rgba(var(--ax-comp-menu-sub-item-bg-color, var(--ax-sys-color-lightest-surface)));background-image:linear-gradient(var(--ax-comp-menu-contrast-surface-overlay-rest),var(--ax-comp-menu-contrast-surface-overlay-rest)),linear-gradient(var(--ax-comp-menu-surface-overlay-rest),var(--ax-comp-menu-surface-overlay-rest));padding-block:var(--ax-comp-menu-items-padding-block, .5rem);border-width:var(--ax-comp-menu-items-border-width, 1px);border-style:solid;border-radius:var(--ax-comp-menu-items-border-radius, var(--ax-sys-border-radius));border-color:rgba(var(--ax-comp-menu-items-border-color, var(--ax-sys-color-border-lightest-surface)));box-shadow:var(--ax-comp-menu-contrast-inner-border-rest),var(--ax-comp-menu-inner-border-rest),var(--ax-comp-menu-shadow-rest);backdrop-filter:var(--ax-comp-menu-backdrop-filter-rest);-webkit-backdrop-filter:var(--ax-comp-menu-backdrop-filter-rest);transition-property:opacity,color;transition-duration:var(--ax-sys-transition-duration);transition-timing-function:var(--ax-sys-transition-timing-function)}:is(ax-context-menu.ax-menu-container,.ax-menu-items).ax-state-open{opacity:1;visibility:visible}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item{color:rgba(var(--ax-comp-menu-item-text-color, var(--ax-sys-color-on-surface)))}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item.ax-danger{color:var(--ax-comp-bg)}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item.ax-danger ax-prefix,:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item.ax-danger ax-suffix ax-text{color:inherit}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item ax-suffix ax-text{color:rgba(var(--ax-comp-menu-item-suffix-text-color));--tw-font-weight: var(--font-weight-normal, 400) !important;font-weight:var(--font-weight-normal, 400)!important}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled){color:rgba(var(--ax-comp-menu-item-hover-text-color, var(--ax-sys-color-on-surface)));background-color:rgba(var(--ax-comp-menu-item-hover-bg-color, var(--ax-sys-color-surface)))!important}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled).ax-danger{color:var(--ax-comp-bg)}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled) ax-suffix ax-text{color:rgba(var(--ax-comp-menu-item-hover-suffix-text-color))}ax-context-menu.ax-action-list-horizontal{padding-inline:var(--ax-comp-menu-action-list-horizontal-padding-inline, 1rem)}ax-menu>ax-menu-item{--ax-comp-action-item-padding-inline: 0;padding-block:var(--ax-comp-menu-items-padding-block, .5rem)}ax-menu>ax-menu-item:has(>.ax-action-item-suffix:not(:empty)){gap:.5rem}ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled){border-radius:var(--ax-comp-menu-items-border-radius, var(--ax-sys-border-radius))}ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled)>ax-icon,ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled)>ax-text{opacity:var(--ax-comp-menu-action-list-hover-decorator-opacity)}ax-menu.ax-action-list-horizontal{min-width:var(--ax-comp-menu-action-list-horizontal-min-width);gap:var(--ax-comp-menu-action-list-horizontal-gap)}ax-menu.ax-action-list-horizontal>ax-title{display:none}ax-menu.ax-action-list-horizontal>ax-menu-item{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-menu.ax-action-list-horizontal>ax-menu-item>.ax-action-item-prefix{padding-inline-start:calc(var(--spacing, .25rem) * 0)!important}ax-menu.ax-action-list-horizontal>ax-menu-item>.ax-action-item-suffix:not(ax-menu.ax-action-list-horizontal>ax-menu-item .ax-action-item-suffix:empty){padding-inline-end:0!important;margin-inline-start:0!important}ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled){background-color:transparent!important}ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled)>.ax-action-item-prefix,ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled)>.ax-action-item-suffix{opacity:var(--ax-comp-menu-action-list-hover-decorator-opacity)}ax-menu.ax-action-list-vertical{width:max-content;min-width:var(--ax-comp-menu-action-list-vertical-min-width)}ax-menu.ax-action-list-vertical>ax-menu-item{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled){background-color:transparent!important}ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled)>.ax-action-item-prefix,ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled)>.ax-action-item-suffix{opacity:var(--ax-comp-menu-action-list-hover-decorator-opacity)}}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "component", type: AXMenuItemComponent, selector: "ax-menu-item", inputs: ["subItems", "name", "data", "disabled", "color"], outputs: ["onClick"] }, { kind: "component", type: AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
958
1121
  }
959
1122
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMenuComponent, decorators: [{
960
1123
  type: Component,
@@ -975,7 +1138,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
975
1138
  AXDecoratorIconComponent,
976
1139
  AsyncPipe,
977
1140
  AXTranslatorPipe,
978
- ], template: "<ng-content select=\"ax-menu-item,ax-divider,ax-title,ng-container\"></ng-content>\n\n@for (node of items(); track node) {\n <ng-container [ngTemplateOutlet]=\"Recursion\" [ngTemplateOutletContext]=\"{ $implicit: node }\"> </ng-container>\n}\n\n<ng-template #Recursion let-item>\n @if (item.group?.title) {\n <ax-title>{{ item.group?.title }}</ax-title>\n }\n <ax-menu-item\n [name]=\"item.name\"\n [data]=\"item.data\"\n [disabled]=\"item.disabled\"\n [color]=\"item.color\"\n [subItems]=\"item.items ?? []\"\n >\n @if (item.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"item.icon\"> </ax-icon>\n </ax-prefix>\n }\n @if (item.text) {\n <ax-text>{{ item.text | translate | async }}</ax-text>\n }\n @if (item.suffix) {\n <ax-suffix>\n <ax-text>{{ item.suffix.text | translate | async }}</ax-text>\n </ax-suffix>\n }\n @for (child of item.items; track child) {\n <ng-container [ngTemplateOutlet]=\"Recursion\" [ngTemplateOutletContext]=\"{ $implicit: child }\"></ng-container>\n }\n </ax-menu-item>\n @if (item.break) {\n <ax-divider></ax-divider>\n }\n</ng-template>\n", styles: ["@layer properties;@layer components{ax-context-menu,ax-menu{display:flex;width:max-content;color:inherit}:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items{visibility:hidden;position:fixed;display:flex;height:max-content;width:max-content;flex-direction:column;border-style:var(--tw-border-style);border-width:1px;--tw-border-style: solid;border-style:solid;padding-block:calc(var(--spacing, .25rem) * 2);opacity:0%;transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s));min-width:calc(var(--spacing, .25rem) * 48);border-radius:var(--radius-default, var(--ax-sys-border-radius));border-color:var(--color-border-lightest, rgba(var(--ax-sys-color-border-lightest-surface)));background-color:var(--color-lightest, rgba(var(--ax-sys-color-lightest-surface)));color:var(--color-on-lightest, rgba(var(--ax-sys-color-on-lightest-surface)));box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a;transition-duration:var(--ax-sys-transition-duration);transition-timing-function:var(--ax-sys-transition-timing-function)}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items).ax-state-open{visibility:visible;opacity:100%}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items) ax-menu-item{color:var(--ax-comp-bg)}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled){background-color:var(--ax-comp-bg);color:var(--ax-comp-bg)}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled) ax-suffix ax-text{color:var(--ax-comp-bg)}:is(:is(ax-context-menu,ax-menu).ax-menu-container,:is(ax-context-menu,ax-menu) .ax-menu-items) ax-menu-item ax-suffix ax-text{--tw-font-weight: var(--font-weight-normal, 400) !important;font-weight:var(--font-weight-normal, 400)!important}ax-context-menu.ax-action-list-horizontal{padding-inline:calc(var(--spacing, .25rem) * 4)}ax-menu>ax-menu-item:has(>.ax-action-item-suffix:not(:empty)){gap:calc(var(--spacing, .25rem) * 2)}ax-menu.ax-action-list-horizontal{min-width:calc(var(--spacing, .25rem) * 48);gap:calc(var(--spacing, .25rem) * 5)}ax-menu.ax-action-list-horizontal>ax-title{display:none}ax-menu.ax-action-list-horizontal>ax-menu-item{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-menu.ax-action-list-horizontal>ax-menu-item>.ax-action-item-prefix{padding-inline-start:calc(var(--spacing, .25rem) * 0)!important}ax-menu.ax-action-list-horizontal>ax-menu-item>.ax-action-item-suffix:not(ax-menu.ax-action-list-horizontal>ax-menu-item .ax-action-item-suffix:empty){margin-inline-end:calc(var(--spacing, .25rem) * 0)!important;padding-inline-start:calc(var(--spacing, .25rem) * 0)!important}ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled){background-color:transparent!important}ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled)>.ax-action-item-prefix,ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled)>.ax-action-item-suffix{opacity:70%}ax-menu.ax-action-list-vertical{width:max-content;min-width:calc(var(--spacing, .25rem) * 48)}ax-menu.ax-action-list-vertical>ax-menu-item{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled){background-color:transparent!important}ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled)>.ax-action-item-prefix,ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled)>.ax-action-item-suffix{opacity:70%}ax-menu>ax-menu-item{padding-block:calc(var(--spacing, .25rem) * 2)}ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled){border-radius:var(--radius-default, var(--ax-sys-border-radius))}ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled)>ax-icon,ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled)>ax-text{opacity:70%}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
1141
+ ], template: "<ng-content select=\"ax-menu-item,ax-divider,ax-title,ng-container\"></ng-content>\n\n@for (node of items(); track node) {\n <ng-container [ngTemplateOutlet]=\"Recursion\" [ngTemplateOutletContext]=\"{ $implicit: node }\"> </ng-container>\n}\n\n<ng-template #Recursion let-item>\n @if (item.group?.title) {\n <ax-title>{{ item.group?.title }}</ax-title>\n }\n <ax-menu-item\n [name]=\"item.name\"\n [data]=\"item.data\"\n [disabled]=\"item.disabled\"\n [color]=\"item.color\"\n [subItems]=\"item.items ?? []\"\n >\n @if (item.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"item.icon\"> </ax-icon>\n </ax-prefix>\n }\n @if (item.text) {\n <ax-text>{{ item.text | translate | async }}</ax-text>\n }\n @if (item.suffix) {\n <ax-suffix>\n <ax-text>{{ item.suffix.text | translate | async }}</ax-text>\n </ax-suffix>\n }\n @for (child of item.items; track child) {\n <ng-container [ngTemplateOutlet]=\"Recursion\" [ngTemplateOutletContext]=\"{ $implicit: child }\"></ng-container>\n }\n </ax-menu-item>\n @if (item.break) {\n <ax-divider></ax-divider>\n }\n</ng-template>\n", styles: ["@layer properties;@layer components{ax-context-menu,ax-menu,.ax-menu-items{--ax-comp-menu-items-min-width: 12rem;--ax-comp-menu-action-list-hover-decorator-opacity: .7;--ax-comp-menu-action-list-horizontal-min-width: 12rem;--ax-comp-menu-action-list-horizontal-gap: 1.25rem;--ax-comp-menu-action-list-vertical-min-width: 12rem}ax-context-menu,ax-menu{display:flex;width:max-content;color:inherit}ax-context-menu.ax-menu-container,.ax-menu-items{--ax-comp-menu-shadow-rest: var(--ax-sys-effect-overlay);--ax-comp-menu-inner-border-rest: var(--ax-sys-inner-border-surface);--ax-comp-menu-contrast-inner-border-rest: var(--ax-sys-contrast-inner-border-surface);--ax-comp-menu-contrast-surface-overlay-rest: var(--ax-sys-contrast-surface-overlay-surface);--ax-comp-menu-backdrop-filter-rest: var(--ax-sys-backdrop-filter-surface);--ax-comp-menu-surface-overlay-rest: var(--ax-sys-surface-overlay-overlay);--ax-comp-action-item-padding-inline: .875rem;opacity:0;display:flex;position:fixed;visibility:hidden;width:max-content;height:max-content;max-height:calc(100dvh - 1rem);flex-direction:column;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;min-width:var(--ax-comp-menu-items-min-width);color:rgba(var(--ax-comp-menu-items-text-color, var(--ax-sys-color-on-lightest-surface)));background-color:rgba(var(--ax-comp-menu-sub-item-bg-color, var(--ax-sys-color-lightest-surface)));background-image:linear-gradient(var(--ax-comp-menu-contrast-surface-overlay-rest),var(--ax-comp-menu-contrast-surface-overlay-rest)),linear-gradient(var(--ax-comp-menu-surface-overlay-rest),var(--ax-comp-menu-surface-overlay-rest));padding-block:var(--ax-comp-menu-items-padding-block, .5rem);border-width:var(--ax-comp-menu-items-border-width, 1px);border-style:solid;border-radius:var(--ax-comp-menu-items-border-radius, var(--ax-sys-border-radius));border-color:rgba(var(--ax-comp-menu-items-border-color, var(--ax-sys-color-border-lightest-surface)));box-shadow:var(--ax-comp-menu-contrast-inner-border-rest),var(--ax-comp-menu-inner-border-rest),var(--ax-comp-menu-shadow-rest);backdrop-filter:var(--ax-comp-menu-backdrop-filter-rest);-webkit-backdrop-filter:var(--ax-comp-menu-backdrop-filter-rest);transition-property:opacity,color;transition-duration:var(--ax-sys-transition-duration);transition-timing-function:var(--ax-sys-transition-timing-function)}:is(ax-context-menu.ax-menu-container,.ax-menu-items).ax-state-open{opacity:1;visibility:visible}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item{color:rgba(var(--ax-comp-menu-item-text-color, var(--ax-sys-color-on-surface)))}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item.ax-danger{color:var(--ax-comp-bg)}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item.ax-danger ax-prefix,:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item.ax-danger ax-suffix ax-text{color:inherit}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item ax-suffix ax-text{color:rgba(var(--ax-comp-menu-item-suffix-text-color));--tw-font-weight: var(--font-weight-normal, 400) !important;font-weight:var(--font-weight-normal, 400)!important}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled){color:rgba(var(--ax-comp-menu-item-hover-text-color, var(--ax-sys-color-on-surface)));background-color:rgba(var(--ax-comp-menu-item-hover-bg-color, var(--ax-sys-color-surface)))!important}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled).ax-danger{color:var(--ax-comp-bg)}:is(ax-context-menu.ax-menu-container,.ax-menu-items) ax-menu-item:hover:not(.ax-state-disabled) ax-suffix ax-text{color:rgba(var(--ax-comp-menu-item-hover-suffix-text-color))}ax-context-menu.ax-action-list-horizontal{padding-inline:var(--ax-comp-menu-action-list-horizontal-padding-inline, 1rem)}ax-menu>ax-menu-item{--ax-comp-action-item-padding-inline: 0;padding-block:var(--ax-comp-menu-items-padding-block, .5rem)}ax-menu>ax-menu-item:has(>.ax-action-item-suffix:not(:empty)){gap:.5rem}ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled){border-radius:var(--ax-comp-menu-items-border-radius, var(--ax-sys-border-radius))}ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled)>ax-icon,ax-menu>ax-menu-item:hover:not(ax-menu ax-menu-item.ax-state-disabled)>ax-text{opacity:var(--ax-comp-menu-action-list-hover-decorator-opacity)}ax-menu.ax-action-list-horizontal{min-width:var(--ax-comp-menu-action-list-horizontal-min-width);gap:var(--ax-comp-menu-action-list-horizontal-gap)}ax-menu.ax-action-list-horizontal>ax-title{display:none}ax-menu.ax-action-list-horizontal>ax-menu-item{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-menu.ax-action-list-horizontal>ax-menu-item>.ax-action-item-prefix{padding-inline-start:calc(var(--spacing, .25rem) * 0)!important}ax-menu.ax-action-list-horizontal>ax-menu-item>.ax-action-item-suffix:not(ax-menu.ax-action-list-horizontal>ax-menu-item .ax-action-item-suffix:empty){padding-inline-end:0!important;margin-inline-start:0!important}ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled){background-color:transparent!important}ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled)>.ax-action-item-prefix,ax-menu.ax-action-list-horizontal>ax-menu-item:hover:not(ax-menu.ax-action-list-horizontal ax-menu-item.ax-state-disabled)>.ax-action-item-suffix{opacity:var(--ax-comp-menu-action-list-hover-decorator-opacity)}ax-menu.ax-action-list-vertical{width:max-content;min-width:var(--ax-comp-menu-action-list-vertical-min-width)}ax-menu.ax-action-list-vertical>ax-menu-item{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled){background-color:transparent!important}ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled)>.ax-action-item-prefix,ax-menu.ax-action-list-vertical>ax-menu-item:hover:not(ax-menu.ax-action-list-vertical ax-menu-item.ax-state-disabled)>.ax-action-item-suffix{opacity:var(--ax-comp-menu-action-list-hover-decorator-opacity)}}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
979
1142
  }], ctorParameters: () => [], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], openOn: [{ type: i0.Input, args: [{ isSignal: true, alias: "openOn", required: false }] }], closeOn: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOn", required: false }] }], onItemClick: [{ type: i0.Output, args: ["onItemClick"] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], hasArrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasArrow", required: false }] }], __hostClass: [{
980
1143
  type: HostBinding,
981
1144
  args: ['class']