@filip.mazev/blocks 1.4.17 → 1.4.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
1
  import { BxSurfaceDirective } from "@filip.mazev/blocks/effects";
2
2
  import * as i0 from "@angular/core";
3
- import { ChangeDetectionStrategy, Component, DestroyRef, Directive, ElementRef, HostListener, InjectionToken, NgZone, PLATFORM_ID, Pipe, TemplateRef, ViewContainerRef, afterEveryRender, afterNextRender, afterRenderEffect, booleanAttribute, computed, contentChild, contentChildren, effect, forwardRef, inject, input, model, output, signal, viewChild, viewChildren } from "@angular/core";
3
+ import { ChangeDetectionStrategy, Component, DestroyRef, Directive, ElementRef, HostListener, Injectable, InjectionToken, NgZone, PLATFORM_ID, Pipe, TemplateRef, ViewContainerRef, afterEveryRender, afterNextRender, afterRenderEffect, booleanAttribute, computed, contentChild, contentChildren, effect, forwardRef, inject, input, model, output, signal, untracked, viewChild, viewChildren } from "@angular/core";
4
4
  import { BX_I18N, BxA11yService, BxOverlayPositionService, BxShortcutService, inheritOverlayTheme, isTextWithKey, resolveText, resolveTokenToCssVar, trackOverlayOrigin, uuidv4 } from "@filip.mazev/blocks/core";
5
5
  import { Icon } from "@filip.mazev/blocks/icons";
6
- import { AriaDescriber, FocusMonitor } from "@angular/cdk/a11y";
6
+ import { AriaDescriber, FocusMonitor, FocusTrapFactory } from "@angular/cdk/a11y";
7
7
  import { Overlay } from "@angular/cdk/overlay";
8
8
  import { ComponentPortal, TemplatePortal } from "@angular/cdk/portal";
9
9
  import { createGlassTransition, inheritGlassLighting } from "@filip.mazev/blocks/effects/runtime";
@@ -106,7 +106,7 @@ var Menu = class Menu {
106
106
  selector: "bx-menu",
107
107
  ngImport: i0,
108
108
  template: "<div data-bx-surface=\"solid\" role=\"menu\" class=\"bx-menu-wrapper\" [class.bx-menu-animated]=\"isAnimated()\">\n <ng-content></ng-content>\n</div>\n",
109
- styles: [":host{display:block}.bx-menu-wrapper{--bx-glass-surface: var(--bx-bg-surface);--bx-glass-text: var(--bx-text-primary);--bx-glass-edge: var(--bx-border-default);--bx-glass-shadow: 0 2px 4px 0 rgba(0, 0, 0, .1), 0 1px 2px -1px rgba(0, 0, 0, .1);--bx-glass-radius: var(--bx-rounded-lg, .75rem);background-color:var(--bx-glass-surface);border:1px solid var(--bx-glass-edge);border-radius:var(--bx-glass-radius, var(--bx-rounded-lg, .75rem));box-shadow:0 2px 4px #0000001a,0 1px 2px -1px #0000001a;padding:.25rem;display:flex;flex-direction:column;min-width:12rem}.bx-menu-wrapper[data-bx-surface=solid]{background:var(--bx-glass-surface)!important;-webkit-backdrop-filter:none;backdrop-filter:none}.bx-menu-wrapper.bx-menu-animated{transition:transform .2s cubic-bezier(.25,.8,.25,1)}.bx-menu-wrapper{transform-origin:top}.bx-menu-wrapper.is-hidden{opacity:0;transform:scaleY(.95);pointer-events:none}:host([data-bx-surface]){border-radius:var(--bx-glass-radius, var(--bx-rounded-lg, .75rem));--bx-glass-shadow: 0 2px 4px 0 rgba(0, 0, 0, .1), 0 1px 2px -1px rgba(0, 0, 0, .1);color:var(--bx-glass-text, var(--bx-text-primary))}:host([data-bx-surface]) .bx-menu-wrapper{background:transparent;border-color:transparent;border-radius:inherit;box-shadow:none}\n"],
109
+ styles: [":host{display:block}.bx-menu-wrapper{--bx-glass-surface: var(--bx-bg-surface);--bx-glass-text: var(--bx-text-primary);--bx-glass-edge: var(--bx-border-default);--bx-glass-shadow: 0 2px 4px 0 rgba(0, 0, 0, .1), 0 1px 2px -1px rgba(0, 0, 0, .1);--bx-glass-radius: var(--bx-rounded-lg, .75rem);background-color:var(--bx-glass-surface);border:1px solid var(--bx-glass-edge);border-radius:var(--bx-glass-radius, var(--bx-rounded-lg, .75rem));box-shadow:0 2px 4px #0000001a,0 1px 2px -1px #0000001a;padding:.25rem;display:flex;flex-direction:column;gap:var(--bx-menu-item-gap, 0);box-sizing:border-box;min-width:var(--bx-menu-min-width, 12rem);max-width:100%}.bx-menu-wrapper[data-bx-surface=solid]{background:var(--bx-glass-surface)!important;-webkit-backdrop-filter:none;backdrop-filter:none}.bx-menu-wrapper.bx-menu-animated{transition:transform .2s cubic-bezier(.25,.8,.25,1)}.bx-menu-wrapper{transform-origin:top}.bx-menu-wrapper.is-hidden{opacity:0;transform:scaleY(.95);pointer-events:none}:host([data-bx-surface]){border-radius:var(--bx-glass-radius, var(--bx-rounded-lg, .75rem));--bx-glass-shadow: 0 2px 4px 0 rgba(0, 0, 0, .1), 0 1px 2px -1px rgba(0, 0, 0, .1);color:var(--bx-glass-text, var(--bx-text-primary))}:host([data-bx-surface]) .bx-menu-wrapper{background:transparent;border-color:transparent;border-radius:inherit;box-shadow:none}\n"],
110
110
  changeDetection: i0.ChangeDetectionStrategy.OnPush
111
111
  });
112
112
  };
@@ -121,7 +121,7 @@ i0.ɵɵngDeclareClassMetadata({
121
121
  selector: "bx-menu",
122
122
  changeDetection: ChangeDetectionStrategy.OnPush,
123
123
  template: "<div data-bx-surface=\"solid\" role=\"menu\" class=\"bx-menu-wrapper\" [class.bx-menu-animated]=\"isAnimated()\">\n <ng-content></ng-content>\n</div>\n",
124
- styles: [":host{display:block}.bx-menu-wrapper{--bx-glass-surface: var(--bx-bg-surface);--bx-glass-text: var(--bx-text-primary);--bx-glass-edge: var(--bx-border-default);--bx-glass-shadow: 0 2px 4px 0 rgba(0, 0, 0, .1), 0 1px 2px -1px rgba(0, 0, 0, .1);--bx-glass-radius: var(--bx-rounded-lg, .75rem);background-color:var(--bx-glass-surface);border:1px solid var(--bx-glass-edge);border-radius:var(--bx-glass-radius, var(--bx-rounded-lg, .75rem));box-shadow:0 2px 4px #0000001a,0 1px 2px -1px #0000001a;padding:.25rem;display:flex;flex-direction:column;min-width:12rem}.bx-menu-wrapper[data-bx-surface=solid]{background:var(--bx-glass-surface)!important;-webkit-backdrop-filter:none;backdrop-filter:none}.bx-menu-wrapper.bx-menu-animated{transition:transform .2s cubic-bezier(.25,.8,.25,1)}.bx-menu-wrapper{transform-origin:top}.bx-menu-wrapper.is-hidden{opacity:0;transform:scaleY(.95);pointer-events:none}:host([data-bx-surface]){border-radius:var(--bx-glass-radius, var(--bx-rounded-lg, .75rem));--bx-glass-shadow: 0 2px 4px 0 rgba(0, 0, 0, .1), 0 1px 2px -1px rgba(0, 0, 0, .1);color:var(--bx-glass-text, var(--bx-text-primary))}:host([data-bx-surface]) .bx-menu-wrapper{background:transparent;border-color:transparent;border-radius:inherit;box-shadow:none}\n"]
124
+ styles: [":host{display:block}.bx-menu-wrapper{--bx-glass-surface: var(--bx-bg-surface);--bx-glass-text: var(--bx-text-primary);--bx-glass-edge: var(--bx-border-default);--bx-glass-shadow: 0 2px 4px 0 rgba(0, 0, 0, .1), 0 1px 2px -1px rgba(0, 0, 0, .1);--bx-glass-radius: var(--bx-rounded-lg, .75rem);background-color:var(--bx-glass-surface);border:1px solid var(--bx-glass-edge);border-radius:var(--bx-glass-radius, var(--bx-rounded-lg, .75rem));box-shadow:0 2px 4px #0000001a,0 1px 2px -1px #0000001a;padding:.25rem;display:flex;flex-direction:column;gap:var(--bx-menu-item-gap, 0);box-sizing:border-box;min-width:var(--bx-menu-min-width, 12rem);max-width:100%}.bx-menu-wrapper[data-bx-surface=solid]{background:var(--bx-glass-surface)!important;-webkit-backdrop-filter:none;backdrop-filter:none}.bx-menu-wrapper.bx-menu-animated{transition:transform .2s cubic-bezier(.25,.8,.25,1)}.bx-menu-wrapper{transform-origin:top}.bx-menu-wrapper.is-hidden{opacity:0;transform:scaleY(.95);pointer-events:none}:host([data-bx-surface]){border-radius:var(--bx-glass-radius, var(--bx-rounded-lg, .75rem));--bx-glass-shadow: 0 2px 4px 0 rgba(0, 0, 0, .1), 0 1px 2px -1px rgba(0, 0, 0, .1);color:var(--bx-glass-text, var(--bx-text-primary))}:host([data-bx-surface]) .bx-menu-wrapper{background:transparent;border-color:transparent;border-radius:inherit;box-shadow:none}\n"]
125
125
  }]
126
126
  }]
127
127
  });
@@ -2559,6 +2559,7 @@ var Tag = class Tag {
2559
2559
  }, ...ngDevMode ? [{ debugName: "resolvedTrailingNumber" }] : /* istanbul ignore next */ []);
2560
2560
  palette = computed(() => TAG_PALETTES[this.color() ?? this.config().color ?? "accent"], ...ngDevMode ? [{ debugName: "palette" }] : /* istanbul ignore next */ []);
2561
2561
  isNumberOnly = computed(() => !this.resolvedText() && !this.resolvedLeadingIcon() && !this.resolvedTrailingIcon() && !!this.resolvedLeadingNumber() !== !!this.resolvedTrailingNumber(), ...ngDevMode ? [{ debugName: "isNumberOnly" }] : /* istanbul ignore next */ []);
2562
+ opaque = input(void 0, ...ngDevMode ? [{ debugName: "opaque" }] : /* istanbul ignore next */ []);
2562
2563
  text = input(void 0, ...ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []);
2563
2564
  config = input({}, ...ngDevMode ? [{ debugName: "config" }] : /* istanbul ignore next */ []);
2564
2565
  color = input(void 0, ...ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []);
@@ -2594,6 +2595,13 @@ var Tag = class Tag {
2594
2595
  isStandalone: true,
2595
2596
  selector: "bx-tag",
2596
2597
  inputs: {
2598
+ opaque: {
2599
+ classPropertyName: "opaque",
2600
+ publicName: "opaque",
2601
+ isSignal: true,
2602
+ isRequired: false,
2603
+ transformFunction: null
2604
+ },
2597
2605
  text: {
2598
2606
  classPropertyName: "text",
2599
2607
  publicName: "text",
@@ -2729,7 +2737,7 @@ var Tag = class Tag {
2729
2737
  isSignal: true
2730
2738
  }],
2731
2739
  ngImport: i0,
2732
- template: "<span class=\"bx-tag\" bxSurface [bxSurfaceInteractive]=\"false\"\n [class.is-filled]=\"resolvedVariant() === 'filled'\" [class.is-outlined]=\"resolvedVariant() === 'outlined'\"\n [class.is-small]=\"resolvedSize() === 'small'\" [class.is-disabled]=\"disabled()\" [class.is-number-only]=\"isNumberOnly()\"\n [attr.aria-disabled]=\"disabled() ? 'true' : null\" [attr.role]=\"resolvedAriaLabel() ? 'group' : null\" [attr.aria-label]=\"resolvedAriaLabel() || null\"\n [attr.tabindex]=\"resolvedTooltip() && focusable() ? 0 : null\" [bxTooltip]=\"resolvedTooltip()\" [placement]=\"tooltipPlacement()\" bxTooltipTouch=\"longpress\">\n @if (resolvedLeadingIcon(); as icon) { <bx-icon [name]=\"icon\" [size]=\"resolvedIconSize()\" /> }\n @if (resolvedLeadingNumber()) { <span class=\"bx-tag-number\">{{ resolvedLeadingNumber() }}</span> }\n @if (resolvedText()) { <span class=\"bx-tag-text\" bxTruncate>{{ resolvedText() }}</span> }\n @if (resolvedTrailingNumber()) { <span class=\"bx-tag-number\">{{ resolvedTrailingNumber() }}</span> }\n @if (resolvedTrailingIcon(); as icon) { <bx-icon [name]=\"icon\" [size]=\"resolvedIconSize()\" /> }\n</span>\n",
2740
+ template: "<span class=\"bx-tag\" bxSurface [bxSurfaceInteractive]=\"false\" [bxReducedTransparency]=\"(opaque() ?? config().opaque) ? true : undefined\"\n [class.is-filled]=\"resolvedVariant() === 'filled'\" [class.is-outlined]=\"resolvedVariant() === 'outlined'\"\n [class.is-small]=\"resolvedSize() === 'small'\" [class.is-disabled]=\"disabled()\" [class.is-number-only]=\"isNumberOnly()\"\n [attr.aria-disabled]=\"disabled() ? 'true' : null\" [attr.role]=\"resolvedAriaLabel() ? 'group' : null\" [attr.aria-label]=\"resolvedAriaLabel() || null\"\n [attr.tabindex]=\"resolvedTooltip() && focusable() ? 0 : null\" [bxTooltip]=\"resolvedTooltip()\" [placement]=\"tooltipPlacement()\" bxTooltipTouch=\"longpress\">\n @if (resolvedLeadingIcon(); as icon) { <bx-icon [name]=\"icon\" [size]=\"resolvedIconSize()\" /> }\n @if (resolvedLeadingNumber()) { <span class=\"bx-tag-number\">{{ resolvedLeadingNumber() }}</span> }\n @if (resolvedText()) { <span class=\"bx-tag-text\" bxTruncate>{{ resolvedText() }}</span> }\n @if (resolvedTrailingNumber()) { <span class=\"bx-tag-number\">{{ resolvedTrailingNumber() }}</span> }\n @if (resolvedTrailingIcon(); as icon) { <bx-icon [name]=\"icon\" [size]=\"resolvedIconSize()\" /> }\n</span>\n",
2733
2741
  styles: [":host{display:inline-flex;min-inline-size:0;max-inline-size:100%;vertical-align:middle}.bx-tag{--bx-glass-surface: var(--bx-tag-background, var(--bx-tag-role-tonal));--bx-glass-text: var(--bx-tag-color, var(--bx-tag-role-text));--bx-glass-edge: var(--bx-tag-border, var(--bx-tag-role-border));--bx-glass-radius: var(--bx-tag-radius, .25rem);--bx-glass-shadow: var(--bx-tag-shadow, none);position:relative;display:inline-flex;align-items:center;justify-content:center;min-inline-size:0;max-inline-size:100%;box-sizing:border-box;gap:var(--bx-tag-gap, .25rem);padding:var(--bx-tag-padding, .25rem .5rem);border:1px solid var(--bx-glass-edge);border-radius:var(--bx-glass-radius);background:var(--bx-glass-surface);color:var(--bx-glass-text);font:inherit;font-size:var(--bx-tag-font-size, .8125rem);line-height:1.4;white-space:nowrap}.bx-tag.is-filled{--bx-glass-surface: var(--bx-tag-background, var(--bx-tag-role-fill));--bx-glass-text: var(--bx-tag-color, var(--bx-tag-role-on-fill));--bx-glass-min-opacity: var(--bx-tag-fill-opacity, .85)}.bx-tag.is-outlined{--bx-glass-surface: var(--bx-tag-background, var(--bx-bg-surface));--bx-glass-opacity: var(--bx-tag-outline-opacity, .12)}.bx-tag.is-small{font-size:var(--bx-tag-font-size, .75rem);padding-block:.125rem}.bx-tag.is-disabled{opacity:var(--bx-tag-disabled-opacity, .5)}.bx-tag.is-number-only{--bx-glass-radius: 50%;inline-size:max-content;min-inline-size:var(--bx-tag-number-size, 1.875rem);aspect-ratio:1;padding:var(--bx-tag-number-padding, .35em)}.bx-tag.is-number-only.is-small{min-inline-size:var(--bx-tag-number-size, 1.5rem)}.bx-tag:focus-visible{outline:2px solid var(--bx-border-brand);outline-offset:2px}.bx-tag-number{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;min-inline-size:1.1em;padding-inline:.25em;border-radius:var(--bx-tag-counter-radius, .25rem);background:var(--bx-tag-counter-background, color-mix(in srgb, currentcolor 12%, transparent));font-variant-numeric:tabular-nums}.is-number-only .bx-tag-number{background:transparent;padding:0}@media(forced-colors:active){.bx-tag.is-disabled{color:GrayText;border-color:GrayText;opacity:1}}\n"],
2734
2742
  dependencies: [
2735
2743
  {
@@ -2805,7 +2813,7 @@ i0.ɵɵngDeclareClassMetadata({
2805
2813
  "[style.--bx-tag-role-tonal]": "palette().tonal",
2806
2814
  "[style.--bx-tag-role-border]": "palette().border"
2807
2815
  },
2808
- template: "<span class=\"bx-tag\" bxSurface [bxSurfaceInteractive]=\"false\"\n [class.is-filled]=\"resolvedVariant() === 'filled'\" [class.is-outlined]=\"resolvedVariant() === 'outlined'\"\n [class.is-small]=\"resolvedSize() === 'small'\" [class.is-disabled]=\"disabled()\" [class.is-number-only]=\"isNumberOnly()\"\n [attr.aria-disabled]=\"disabled() ? 'true' : null\" [attr.role]=\"resolvedAriaLabel() ? 'group' : null\" [attr.aria-label]=\"resolvedAriaLabel() || null\"\n [attr.tabindex]=\"resolvedTooltip() && focusable() ? 0 : null\" [bxTooltip]=\"resolvedTooltip()\" [placement]=\"tooltipPlacement()\" bxTooltipTouch=\"longpress\">\n @if (resolvedLeadingIcon(); as icon) { <bx-icon [name]=\"icon\" [size]=\"resolvedIconSize()\" /> }\n @if (resolvedLeadingNumber()) { <span class=\"bx-tag-number\">{{ resolvedLeadingNumber() }}</span> }\n @if (resolvedText()) { <span class=\"bx-tag-text\" bxTruncate>{{ resolvedText() }}</span> }\n @if (resolvedTrailingNumber()) { <span class=\"bx-tag-number\">{{ resolvedTrailingNumber() }}</span> }\n @if (resolvedTrailingIcon(); as icon) { <bx-icon [name]=\"icon\" [size]=\"resolvedIconSize()\" /> }\n</span>\n",
2816
+ template: "<span class=\"bx-tag\" bxSurface [bxSurfaceInteractive]=\"false\" [bxReducedTransparency]=\"(opaque() ?? config().opaque) ? true : undefined\"\n [class.is-filled]=\"resolvedVariant() === 'filled'\" [class.is-outlined]=\"resolvedVariant() === 'outlined'\"\n [class.is-small]=\"resolvedSize() === 'small'\" [class.is-disabled]=\"disabled()\" [class.is-number-only]=\"isNumberOnly()\"\n [attr.aria-disabled]=\"disabled() ? 'true' : null\" [attr.role]=\"resolvedAriaLabel() ? 'group' : null\" [attr.aria-label]=\"resolvedAriaLabel() || null\"\n [attr.tabindex]=\"resolvedTooltip() && focusable() ? 0 : null\" [bxTooltip]=\"resolvedTooltip()\" [placement]=\"tooltipPlacement()\" bxTooltipTouch=\"longpress\">\n @if (resolvedLeadingIcon(); as icon) { <bx-icon [name]=\"icon\" [size]=\"resolvedIconSize()\" /> }\n @if (resolvedLeadingNumber()) { <span class=\"bx-tag-number\">{{ resolvedLeadingNumber() }}</span> }\n @if (resolvedText()) { <span class=\"bx-tag-text\" bxTruncate>{{ resolvedText() }}</span> }\n @if (resolvedTrailingNumber()) { <span class=\"bx-tag-number\">{{ resolvedTrailingNumber() }}</span> }\n @if (resolvedTrailingIcon(); as icon) { <bx-icon [name]=\"icon\" [size]=\"resolvedIconSize()\" /> }\n</span>\n",
2809
2817
  styles: [":host{display:inline-flex;min-inline-size:0;max-inline-size:100%;vertical-align:middle}.bx-tag{--bx-glass-surface: var(--bx-tag-background, var(--bx-tag-role-tonal));--bx-glass-text: var(--bx-tag-color, var(--bx-tag-role-text));--bx-glass-edge: var(--bx-tag-border, var(--bx-tag-role-border));--bx-glass-radius: var(--bx-tag-radius, .25rem);--bx-glass-shadow: var(--bx-tag-shadow, none);position:relative;display:inline-flex;align-items:center;justify-content:center;min-inline-size:0;max-inline-size:100%;box-sizing:border-box;gap:var(--bx-tag-gap, .25rem);padding:var(--bx-tag-padding, .25rem .5rem);border:1px solid var(--bx-glass-edge);border-radius:var(--bx-glass-radius);background:var(--bx-glass-surface);color:var(--bx-glass-text);font:inherit;font-size:var(--bx-tag-font-size, .8125rem);line-height:1.4;white-space:nowrap}.bx-tag.is-filled{--bx-glass-surface: var(--bx-tag-background, var(--bx-tag-role-fill));--bx-glass-text: var(--bx-tag-color, var(--bx-tag-role-on-fill));--bx-glass-min-opacity: var(--bx-tag-fill-opacity, .85)}.bx-tag.is-outlined{--bx-glass-surface: var(--bx-tag-background, var(--bx-bg-surface));--bx-glass-opacity: var(--bx-tag-outline-opacity, .12)}.bx-tag.is-small{font-size:var(--bx-tag-font-size, .75rem);padding-block:.125rem}.bx-tag.is-disabled{opacity:var(--bx-tag-disabled-opacity, .5)}.bx-tag.is-number-only{--bx-glass-radius: 50%;inline-size:max-content;min-inline-size:var(--bx-tag-number-size, 1.875rem);aspect-ratio:1;padding:var(--bx-tag-number-padding, .35em)}.bx-tag.is-number-only.is-small{min-inline-size:var(--bx-tag-number-size, 1.5rem)}.bx-tag:focus-visible{outline:2px solid var(--bx-border-brand);outline-offset:2px}.bx-tag-number{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;min-inline-size:1.1em;padding-inline:.25em;border-radius:var(--bx-tag-counter-radius, .25rem);background:var(--bx-tag-counter-background, color-mix(in srgb, currentcolor 12%, transparent));font-variant-numeric:tabular-nums}.is-number-only .bx-tag-number{background:transparent;padding:0}@media(forced-colors:active){.bx-tag.is-disabled{color:GrayText;border-color:GrayText;opacity:1}}\n"]
2810
2818
  }]
2811
2819
  }],
@@ -2814,6 +2822,14 @@ i0.ɵɵngDeclareClassMetadata({
2814
2822
  type: i0.ViewChild,
2815
2823
  args: [i0.forwardRef(() => TruncateDirective), { isSignal: true }]
2816
2824
  }],
2825
+ opaque: [{
2826
+ type: i0.Input,
2827
+ args: [{
2828
+ isSignal: true,
2829
+ alias: "opaque",
2830
+ required: false
2831
+ }]
2832
+ }],
2817
2833
  text: [{
2818
2834
  type: i0.Input,
2819
2835
  args: [{
@@ -2952,6 +2968,424 @@ i0.ɵɵngDeclareClassMetadata({
2952
2968
  }]
2953
2969
  }
2954
2970
  });
2955
- export { BX_OVERLAY_CONTEXT, BxOverlayContextDirective, ContextMenuDirective, DropdownDirective, LoadingIndicator, LoadingSpinner, Menu, MenuItem, ProgressBar, Tab, TabContentDirective, Tabs, Tag, Tooltip, TooltipDirective, TruncateDirective, TruncatedTextPipe, truncatedText };
2971
+ var MenuCascadeService = class MenuCascadeService {
2972
+ entries = /* @__PURE__ */ new Set();
2973
+ activate(trigger) {
2974
+ const ancestors = /* @__PURE__ */ new Set();
2975
+ let parent = trigger.menuParent();
2976
+ while (parent) {
2977
+ ancestors.add(parent);
2978
+ parent = parent.menuParent();
2979
+ }
2980
+ for (const entry of [...this.entries]) if (!ancestors.has(entry) && entry !== trigger) entry.close();
2981
+ this.entries.add(trigger);
2982
+ }
2983
+ remove(trigger) {
2984
+ this.entries.delete(trigger);
2985
+ }
2986
+ closeChildren(trigger) {
2987
+ for (const entry of [...this.entries]) if (entry.menuParent() === trigger) entry.close();
2988
+ }
2989
+ contains(trigger, target) {
2990
+ return trigger.contains(target) || [...this.entries].some((entry) => entry.menuParent() === trigger && this.contains(entry, target));
2991
+ }
2992
+ hasOpenMenus() {
2993
+ return this.entries.size > 0;
2994
+ }
2995
+ repositionChildren(trigger) {
2996
+ for (const entry of [...this.entries]) if (entry.menuParent() === trigger) entry.reposition();
2997
+ }
2998
+ closeAll(restoreFocus = false) {
2999
+ [...this.entries].find((entry) => !entry.menuParent())?.close(restoreFocus);
3000
+ }
3001
+ static ɵfac = i0.ɵɵngDeclareFactory({
3002
+ minVersion: "12.0.0",
3003
+ version: "22.2.3",
3004
+ ngImport: i0,
3005
+ type: MenuCascadeService,
3006
+ deps: [],
3007
+ target: i0.ɵɵFactoryTarget.Injectable
3008
+ });
3009
+ static ɵprov = i0.ɵɵngDeclareInjectable({
3010
+ minVersion: "12.0.0",
3011
+ version: "22.2.3",
3012
+ ngImport: i0,
3013
+ type: MenuCascadeService,
3014
+ providedIn: "root"
3015
+ });
3016
+ };
3017
+ i0.ɵɵngDeclareClassMetadata({
3018
+ minVersion: "12.0.0",
3019
+ version: "22.2.3",
3020
+ ngImport: i0,
3021
+ type: MenuCascadeService,
3022
+ decorators: [{
3023
+ type: Injectable,
3024
+ args: [{ providedIn: "root" }]
3025
+ }]
3026
+ });
3027
+ function navigateMenuKey(event, menu) {
3028
+ if (![
3029
+ "ArrowDown",
3030
+ "ArrowUp",
3031
+ "Home",
3032
+ "End"
3033
+ ].includes(event.key)) return false;
3034
+ const items = Array.from(menu.querySelectorAll("[role=\"menuitem\"]")).filter((item) => item.closest("[role=\"menu\"]") === menu && !item.matches(":disabled, [aria-disabled=\"true\"]") && item.getClientRects().length > 0);
3035
+ if (!items.length) return false;
3036
+ const current = items.indexOf(menu.ownerDocument.activeElement);
3037
+ const index = event.key === "Home" ? 0 : event.key === "End" ? items.length - 1 : event.key === "ArrowDown" ? (current + 1) % items.length : (current - 1 + items.length) % items.length;
3038
+ event.preventDefault();
3039
+ event.stopPropagation();
3040
+ items[index].focus();
3041
+ return true;
3042
+ }
3043
+ var MenuTriggerDirective = class MenuTriggerDirective {
3044
+ source = inject(ElementRef).nativeElement;
3045
+ overlay = inject(Overlay);
3046
+ overlayContext = inject(BX_OVERLAY_CONTEXT, { optional: true });
3047
+ zone = inject(NgZone);
3048
+ positions = inject(BxOverlayPositionService);
3049
+ cascade = inject(MenuCascadeService);
3050
+ vcr = inject(ViewContainerRef);
3051
+ traps = inject(FocusTrapFactory);
3052
+ opened = signal(false, ...ngDevMode ? [{ debugName: "opened" }] : /* istanbul ignore next */ []);
3053
+ overlayId = signal(null, ...ngDevMode ? [{ debugName: "overlayId" }] : /* istanbul ignore next */ []);
3054
+ isOpen = this.opened.asReadonly();
3055
+ bxMenuTrigger = input.required(...ngDevMode ? [{ debugName: "bxMenuTrigger" }] : /* istanbul ignore next */ []);
3056
+ menuOrigin = input(void 0, ...ngDevMode ? [{ debugName: "menuOrigin" }] : /* istanbul ignore next */ []);
3057
+ menuParent = input(void 0, ...ngDevMode ? [{ debugName: "menuParent" }] : /* istanbul ignore next */ []);
3058
+ menuSide = input("right", ...ngDevMode ? [{ debugName: "menuSide" }] : /* istanbul ignore next */ []);
3059
+ menuHover = input(true, ...ngDevMode ? [{ debugName: "menuHover" }] : /* istanbul ignore next */ []);
3060
+ menuLabel = input("", ...ngDevMode ? [{ debugName: "menuLabel" }] : /* istanbul ignore next */ []);
3061
+ menuPinned = input(false, ...ngDevMode ? [{ debugName: "menuPinned" }] : /* istanbul ignore next */ []);
3062
+ menuOpened = output();
3063
+ menuClosed = output();
3064
+ overlayRef;
3065
+ trap;
3066
+ subscriptions = new Subscription();
3067
+ disconnectTheme;
3068
+ hoverTimer;
3069
+ positionTracker;
3070
+ constructor() {
3071
+ inject(DestroyRef).onDestroy(() => this.close());
3072
+ effect(() => {
3073
+ const label = this.menuLabel();
3074
+ const opened = this.isOpen();
3075
+ untracked(() => {
3076
+ if (opened) this.overlayRef?.overlayElement.querySelector("[role=\"menu\"]")?.setAttribute("aria-label", label || this.source.getAttribute("aria-label") || this.source.textContent?.trim() || "");
3077
+ });
3078
+ });
3079
+ }
3080
+ toggle(event) {
3081
+ event.preventDefault();
3082
+ event.stopPropagation();
3083
+ if (this.isOpen()) this.close(true);
3084
+ else this.open(true);
3085
+ }
3086
+ open(focus = false) {
3087
+ this.cancelClose();
3088
+ if (this.isOpen()) {
3089
+ if (focus) this.focusFirst();
3090
+ return;
3091
+ }
3092
+ if (!this.source.ownerDocument.defaultView || this.source.matches(":disabled, [aria-disabled=\"true\"]")) return;
3093
+ this.cascade.activate(this);
3094
+ const overlay = this.overlay.create({
3095
+ positionStrategy: this.positions.getSubmenuStrategy(this.menuOrigin() ?? this.source, this.menuSide()),
3096
+ scrollStrategy: this.overlay.scrollStrategies.noop(),
3097
+ usePopover: !!this.overlayContext?.useTopLayer || !!this.source.closest("dialog, [role=\"dialog\"], [role=\"alertdialog\"], bx-modal, bx-modal-core, [popover]"),
3098
+ direction: "ltr",
3099
+ hasBackdrop: false
3100
+ });
3101
+ this.overlayRef = overlay;
3102
+ this.overlayId.set(overlay.overlayElement.id);
3103
+ this.opened.set(true);
3104
+ this.disconnectTheme = inheritOverlayTheme(this.source, overlay.overlayElement);
3105
+ this.subscriptions = new Subscription();
3106
+ overlay.attach(new TemplatePortal(this.bxMenuTrigger(), this.vcr)).detectChanges();
3107
+ const menu = overlay.overlayElement.querySelector("[role=\"menu\"]");
3108
+ if (menu) menu.setAttribute("aria-label", this.menuLabel() || this.source.getAttribute("aria-label") || this.source.textContent?.trim() || "");
3109
+ this.trap = this.traps.create(overlay.overlayElement);
3110
+ const tracker = this.zone.runOutsideAngular(() => trackOverlayOrigin(overlay, this.menuOrigin() ?? this.source, {
3111
+ onPosition: () => this.cascade.repositionChildren(this),
3112
+ onOriginHidden: () => this.zone.run(() => this.close())
3113
+ }));
3114
+ this.positionTracker = tracker;
3115
+ this.subscriptions.add(() => {
3116
+ tracker();
3117
+ this.positionTracker = void 0;
3118
+ });
3119
+ if (this.overlayRef !== overlay) return;
3120
+ this.subscriptions.add(overlay.keydownEvents().subscribe((event) => this.onMenuKey(event)));
3121
+ this.subscriptions.add(overlay.outsidePointerEvents().subscribe((event) => {
3122
+ if (event.target instanceof Node && !this.cascade.contains(this, event.target)) this.close();
3123
+ }));
3124
+ this.subscriptions.add(overlay.detachments().subscribe(() => this.close()));
3125
+ const enter = () => this.cancelClose();
3126
+ const leave = () => this.scheduleClose();
3127
+ overlay.overlayElement.addEventListener("pointerenter", enter);
3128
+ overlay.overlayElement.addEventListener("pointerleave", leave);
3129
+ this.subscriptions.add(() => {
3130
+ overlay.overlayElement.removeEventListener("pointerenter", enter);
3131
+ overlay.overlayElement.removeEventListener("pointerleave", leave);
3132
+ });
3133
+ overlay.updatePosition();
3134
+ if (focus) this.focusFirst();
3135
+ this.menuOpened.emit();
3136
+ }
3137
+ close(restoreFocus = false) {
3138
+ this.cancelClose();
3139
+ if (!this.overlayRef) return;
3140
+ this.cascade.closeChildren(this);
3141
+ const overlay = this.overlayRef;
3142
+ this.overlayRef = void 0;
3143
+ if (restoreFocus || overlay.overlayElement.contains(this.source.ownerDocument.activeElement)) this.source.focus({ preventScroll: true });
3144
+ this.subscriptions.unsubscribe();
3145
+ this.trap?.destroy();
3146
+ this.trap = void 0;
3147
+ this.disconnectTheme?.();
3148
+ this.disconnectTheme = void 0;
3149
+ overlay.dispose();
3150
+ this.cascade.remove(this);
3151
+ this.overlayId.set(null);
3152
+ this.opened.set(false);
3153
+ this.menuClosed.emit();
3154
+ }
3155
+ reposition() {
3156
+ this.positionTracker?.reposition();
3157
+ }
3158
+ contains(target) {
3159
+ return this.source.contains(target) || !!this.overlayRef?.overlayElement.contains(target);
3160
+ }
3161
+ scheduleClose() {
3162
+ if (this.menuPinned()) return;
3163
+ this.cancelClose();
3164
+ this.hoverTimer = this.source.ownerDocument.defaultView?.setTimeout(() => {
3165
+ const focused = this.source.ownerDocument.activeElement;
3166
+ if (!focused || !this.cascade.contains(this, focused)) this.close();
3167
+ }, 240);
3168
+ }
3169
+ onPointerEnter(event) {
3170
+ if (this.menuHover() && event.pointerType !== "touch") this.open();
3171
+ }
3172
+ onKey(event) {
3173
+ if (![
3174
+ this.menuSide() === "right" ? "ArrowRight" : "ArrowLeft",
3175
+ "ArrowDown",
3176
+ "ArrowUp"
3177
+ ].includes(event.key)) return;
3178
+ event.preventDefault();
3179
+ event.stopPropagation();
3180
+ this.open(true);
3181
+ }
3182
+ cancelClose() {
3183
+ this.source.ownerDocument.defaultView?.clearTimeout(this.hoverTimer);
3184
+ this.hoverTimer = void 0;
3185
+ this.menuParent()?.cancelClose();
3186
+ }
3187
+ focusFirst() {
3188
+ this.overlayRef?.overlayElement.querySelector("[role=\"menuitem\"]:not(:disabled):not([aria-disabled=\"true\"])")?.focus();
3189
+ }
3190
+ onMenuKey(event) {
3191
+ if (event.defaultPrevented) return;
3192
+ const backward = this.menuSide() === "right" ? "ArrowLeft" : "ArrowRight";
3193
+ if (event.key === "Escape" || event.key === backward) {
3194
+ event.preventDefault();
3195
+ event.stopPropagation();
3196
+ this.close(true);
3197
+ return;
3198
+ }
3199
+ const menu = event.target?.closest("[role=\"menu\"]");
3200
+ if (menu) navigateMenuKey(event, menu);
3201
+ }
3202
+ static ɵfac = i0.ɵɵngDeclareFactory({
3203
+ minVersion: "12.0.0",
3204
+ version: "22.2.3",
3205
+ ngImport: i0,
3206
+ type: MenuTriggerDirective,
3207
+ deps: [],
3208
+ target: i0.ɵɵFactoryTarget.Directive
3209
+ });
3210
+ static ɵdir = i0.ɵɵngDeclareDirective({
3211
+ minVersion: "17.1.0",
3212
+ version: "22.2.3",
3213
+ type: MenuTriggerDirective,
3214
+ isStandalone: true,
3215
+ selector: "[bxMenuTrigger]",
3216
+ inputs: {
3217
+ bxMenuTrigger: {
3218
+ classPropertyName: "bxMenuTrigger",
3219
+ publicName: "bxMenuTrigger",
3220
+ isSignal: true,
3221
+ isRequired: true,
3222
+ transformFunction: null
3223
+ },
3224
+ menuOrigin: {
3225
+ classPropertyName: "menuOrigin",
3226
+ publicName: "menuOrigin",
3227
+ isSignal: true,
3228
+ isRequired: false,
3229
+ transformFunction: null
3230
+ },
3231
+ menuParent: {
3232
+ classPropertyName: "menuParent",
3233
+ publicName: "menuParent",
3234
+ isSignal: true,
3235
+ isRequired: false,
3236
+ transformFunction: null
3237
+ },
3238
+ menuSide: {
3239
+ classPropertyName: "menuSide",
3240
+ publicName: "menuSide",
3241
+ isSignal: true,
3242
+ isRequired: false,
3243
+ transformFunction: null
3244
+ },
3245
+ menuHover: {
3246
+ classPropertyName: "menuHover",
3247
+ publicName: "menuHover",
3248
+ isSignal: true,
3249
+ isRequired: false,
3250
+ transformFunction: null
3251
+ },
3252
+ menuLabel: {
3253
+ classPropertyName: "menuLabel",
3254
+ publicName: "menuLabel",
3255
+ isSignal: true,
3256
+ isRequired: false,
3257
+ transformFunction: null
3258
+ },
3259
+ menuPinned: {
3260
+ classPropertyName: "menuPinned",
3261
+ publicName: "menuPinned",
3262
+ isSignal: true,
3263
+ isRequired: false,
3264
+ transformFunction: null
3265
+ }
3266
+ },
3267
+ outputs: {
3268
+ menuOpened: "menuOpened",
3269
+ menuClosed: "menuClosed"
3270
+ },
3271
+ host: {
3272
+ listeners: {
3273
+ "click": "toggle($event)",
3274
+ "pointerleave": "scheduleClose()",
3275
+ "pointerenter": "onPointerEnter($event)",
3276
+ "keydown": "onKey($event)"
3277
+ },
3278
+ properties: {
3279
+ "attr.aria-haspopup": "\"menu\"",
3280
+ "attr.aria-expanded": "isOpen()",
3281
+ "attr.aria-controls": "overlayId()"
3282
+ }
3283
+ },
3284
+ exportAs: ["bxMenuTrigger"],
3285
+ ngImport: i0
3286
+ });
3287
+ };
3288
+ i0.ɵɵngDeclareClassMetadata({
3289
+ minVersion: "12.0.0",
3290
+ version: "22.2.3",
3291
+ ngImport: i0,
3292
+ type: MenuTriggerDirective,
3293
+ decorators: [{
3294
+ type: Directive,
3295
+ args: [{
3296
+ selector: "[bxMenuTrigger]",
3297
+ exportAs: "bxMenuTrigger",
3298
+ host: {
3299
+ "[attr.aria-haspopup]": "\"menu\"",
3300
+ "[attr.aria-expanded]": "isOpen()",
3301
+ "[attr.aria-controls]": "overlayId()"
3302
+ }
3303
+ }]
3304
+ }],
3305
+ ctorParameters: () => [],
3306
+ propDecorators: {
3307
+ bxMenuTrigger: [{
3308
+ type: i0.Input,
3309
+ args: [{
3310
+ isSignal: true,
3311
+ alias: "bxMenuTrigger",
3312
+ required: true
3313
+ }]
3314
+ }],
3315
+ menuOrigin: [{
3316
+ type: i0.Input,
3317
+ args: [{
3318
+ isSignal: true,
3319
+ alias: "menuOrigin",
3320
+ required: false
3321
+ }]
3322
+ }],
3323
+ menuParent: [{
3324
+ type: i0.Input,
3325
+ args: [{
3326
+ isSignal: true,
3327
+ alias: "menuParent",
3328
+ required: false
3329
+ }]
3330
+ }],
3331
+ menuSide: [{
3332
+ type: i0.Input,
3333
+ args: [{
3334
+ isSignal: true,
3335
+ alias: "menuSide",
3336
+ required: false
3337
+ }]
3338
+ }],
3339
+ menuHover: [{
3340
+ type: i0.Input,
3341
+ args: [{
3342
+ isSignal: true,
3343
+ alias: "menuHover",
3344
+ required: false
3345
+ }]
3346
+ }],
3347
+ menuLabel: [{
3348
+ type: i0.Input,
3349
+ args: [{
3350
+ isSignal: true,
3351
+ alias: "menuLabel",
3352
+ required: false
3353
+ }]
3354
+ }],
3355
+ menuPinned: [{
3356
+ type: i0.Input,
3357
+ args: [{
3358
+ isSignal: true,
3359
+ alias: "menuPinned",
3360
+ required: false
3361
+ }]
3362
+ }],
3363
+ menuOpened: [{
3364
+ type: i0.Output,
3365
+ args: ["menuOpened"]
3366
+ }],
3367
+ menuClosed: [{
3368
+ type: i0.Output,
3369
+ args: ["menuClosed"]
3370
+ }],
3371
+ toggle: [{
3372
+ type: HostListener,
3373
+ args: ["click", ["$event"]]
3374
+ }],
3375
+ scheduleClose: [{
3376
+ type: HostListener,
3377
+ args: ["pointerleave"]
3378
+ }],
3379
+ onPointerEnter: [{
3380
+ type: HostListener,
3381
+ args: ["pointerenter", ["$event"]]
3382
+ }],
3383
+ onKey: [{
3384
+ type: HostListener,
3385
+ args: ["keydown", ["$event"]]
3386
+ }]
3387
+ }
3388
+ });
3389
+ export { BX_OVERLAY_CONTEXT, BxOverlayContextDirective, ContextMenuDirective, DropdownDirective, LoadingIndicator, LoadingSpinner, Menu, MenuCascadeService, MenuItem, MenuTriggerDirective, ProgressBar, Tab, TabContentDirective, Tabs, Tag, Tooltip, TooltipDirective, TruncateDirective, TruncatedTextPipe, navigateMenuKey, truncatedText };
2956
3390
 
2957
3391
  //# sourceMappingURL=filip.mazev-blocks-primitives.mjs.map